Access Denied - Keywords: Zugriff, Sperren, Gesperrt, Status, Preview-Link, Sharing, Kategoriesperrung, Artikelstatus

Übersicht

Access Denied erweitert REDAXO um einen zusätzlichen Status “gesperrt” für Artikel und Kategorien. Gesperrte Artikel sind im Frontend nicht aufrufbar und leiten automatisch zur 404-Seite um – außer mit Preview-Link oder aus dem Backend heraus. Ideal für Staging-Inhalte oder zeitlich begrenzte Freigaben.

Autor: Friends Of REDAXO
GitHub: https://github.com/FriendsOfREDAXO/accessdenied
Abhängigkeiten: REDAXO >= 5.17
Optional: YRewrite (für Preview-Link-Generierung), search_it (Index-Update empfohlen)


Kern-Klasse

Klasse Beschreibung
FriendsOfRedaxo\Accessdenied\Accessdenied Hauptklasse mit allen Sperre-Funktionen

Status-Werte

Status Wert Beschreibung Farbe
Offline 0 Standard REDAXO - im Frontend nicht aufrufbar Grau
Online 1 Standard REDAXO - im Frontend aufrufbar Grün
Gesperrt 2 Neu: leitet zu 404-Seite um (außer mit Preview-Link) Rot

Methoden

Methode Beschreibung
initializeSearchItPrevention() Verhindert Indexierung gesperrter Artikel in search_it
preventSearchItIndexing($ep) Extension-Point-Handler für Search It
addLockedStatus($ep) Fügt Status “gesperrt” zu Artikel-/Kategorie-Status hinzu
handleFrontendRedirect() Prüft Status und leitet ggf. zur 404-Seite um
redirectToNotFound() Leitet zur Fehlerseite um
setDefaultArticleStatus($ep) Setzt Default-Status bei neuem Artikel
setDefaultCategoryStatus($ep) Setzt Default-Status bei neuer Kategorie
addContentSidebar($ep) Zeigt Preview-Link-Panel in gesperrten Artikeln

Konfiguration

Config-Key Typ Beschreibung Default
default_status int Standard-Status für neue Artikel/Kategorien (0, 1, 2) 1 (Online)
inherit bool Vererbung der Sperrung auf Unterseiten aktivieren false
linkparameter string GET-Parameter für Preview-Link 'preview'

20 Praxisbeispiele

1. Artikel auf “gesperrt” setzen

$article = rex_article::get(42);
rex_article_service::articleStatus(42, $article->getClang(), 2);
echo "Artikel gesperrt.";

2. Kategorie auf “gesperrt” setzen

rex_category_service::categoryStatus(5, 1, 2);
echo "Kategorie gesperrt.";

3. Status eines Artikels prüfen

$article = rex_article::getCurrent();
if ($article->getValue('status') == 2) {
    echo "Dieser Artikel ist gesperrt.";
}
// Wird automatisch im Backend-Panel angezeigt
$previewLink = rex_yrewrite::getFullUrlByArticleId($articleId) . '?preview=id-' . $articleId;
echo '<a href="' . $previewLink . '">Vorschau</a>';
https://example.org/gesperrter-artikel?preview=id-42
$linkparameter = rex_config::get('accessdenied', 'linkparameter', 'preview');
$articleId = rex_article::getCurrent()->getId();

if (rex_request($linkparameter, 'string', '') == 'id-' . $articleId) {
    echo "Preview-Modus aktiv!";
}

7. Default-Status auf “gesperrt” setzen

// Neue Artikel/Kategorien werden standardmäßig gesperrt
rex_config::set('accessdenied', 'default_status', 2);

8. Default-Status auf “online” setzen

rex_config::set('accessdenied', 'default_status', 1);

9. Vererbung aktivieren

// Gesperrte Kategorien sperren auch Unterseiten
rex_config::set('accessdenied', 'inherit', true);

10. Vererbung deaktivieren

rex_config::set('accessdenied', 'inherit', false);

11. Custom Preview-Parameter

// Statt ?preview=id-42 → ?staging=id-42
rex_config::set('accessdenied', 'linkparameter', 'staging');

12. Prüfen, ob Artikel in gesperrter Kategorie

$cat = rex_category::getCurrent();
$package = rex_addon::get('accessdenied');

if ($package->getConfig('inherit') == true && 
    $cat && 
    $cat->getClosest(fn (rex_category $cat) => 2 == $cat->getValue('status'))) {
    echo "Diese Kategorie oder eine Elternkategorie ist gesperrt.";
}

13. Extension Point: Redirect verhindern

// boot.php
rex_extension::register('PACKAGES_INCLUDED', function($ep) {
    // Custom Logic vor Access Denied Redirect
    if (rex_article::getCurrent()->getValue('status') == 2) {
        // Eigene Logik statt 404-Redirect
    }
}, rex_extension::EARLY); // Vor LATE von Access Denied

14. Search It Index bei Sperrung aktualisieren

// Nach Änderung des Status
rex_article_service::articleStatus($articleId, $clangId, 2);

if (rex_addon::get('search_it')->isAvailable()) {
    search_it_indexer::factory()->indexArticle($articleId);
}

15. Alle gesperrten Artikel finden

$sql = rex_sql::factory();
$articles = $sql->getArray('SELECT * FROM rex_article WHERE status = 2');

foreach ($articles as $article) {
    echo rex_article::get($article['id'])->getName() . '<br>';
}

16. Alle gesperrten Kategorien finden

$sql = rex_sql::factory();
$categories = $sql->getArray('SELECT * FROM rex_article WHERE pid = 0 AND status = 2');

foreach ($categories as $cat) {
    echo rex_category::get($cat['id'])->getName() . '<br>';
}

17. Backend-Check: Aus Backend aufgerufen?

if (rex_backend_login::hasSession()) {
    echo "Zugriff aus Backend - gesperrte Artikel werden angezeigt.";
}

18. Quick Navigation Styling

/* Automatisch geladen - gesperrte Artikel in rot */
a.quicknavi_left.qn_status_2 {
    opacity: 0.6;
    border-left: 8px solid #FF4040;
}

19. Multi-Domain: Preview nur für eigene Domain

// Bei Multi-Domain-Setup muss User unter passender Domain eingeloggt sein
$currentDomain = rex_yrewrite::getCurrentDomain();
if ($currentDomain && !rex_backend_login::hasSession()) {
    // Redirect zu 404
    rex_redirect(rex_article::getNotfoundArticleId(), rex_clang::getCurrentId());
}

20. Deinstallation: Alle gesperrten Artikel auf offline setzen

// Wird automatisch bei Deinstallation ausgeführt
$sql = rex_sql::factory();
$sql->setQuery('UPDATE ' . rex::getTablePrefix() . 'article SET status=0 WHERE status = 2');
rex_addon::get('structure')->clearCache();

Backend-Integration

Status-Auswahl

  • In Artikel-/Kategorie-Einstellungen erscheint neuer Status “gesperrt”
  • Rot markiert mit Warndreieck-Symbol (fa fa-exclamation-triangle)
  • Bei gesperrten Artikeln wird automatisch ein Panel angezeigt
  • Enthält Share-Link mit Preview-Parameter
  • Copy-to-Clipboard-Button für einfaches Teilen
  • Erscheint in Content-Sidebar

Quick Navigation

  • Gesperrte Artikel werden mit rotem Rand dargestellt
  • Opacity 0.6 zur visuellen Unterscheidung
  • Funktioniert mit Quick Navigation >= 8.1

Settings (System → Access denied)

  1. Default-Status: Wähle, ob neue Artikel/Kategorien standardmäßig offline, online oder gesperrt angelegt werden
  2. Vererbung: Aktiviere/deaktiviere die Vererbung von Kategorie-Sperrungen auf Unterkategorien und Artikel
  3. Link-Parameter: Passe den GET-Parameter für Preview-Links an (Standard: preview)

Frontend-Verhalten

https://example.org/gesperrter-artikel
→ Redirect zu 404-Seite (rex_article::getNotfoundArticleId())
https://example.org/gesperrter-artikel?preview=id-42
→ Artikel wird normal angezeigt

Aus Backend

User eingeloggt im Backend
→ Artikel wird normal angezeigt

Vererbungs-Logik

Kategorie gesperrt + Vererbung aktiv

Kategorie "News" (Status: gesperrt)
  ├─ Artikel "News 1" (Status: online) → trotzdem gesperrt durch Vererbung
  ├─ Unterkategorie "Archiv" (Status: online) → trotzdem gesperrt
  │   └─ Artikel "Alt" (Status: online) → trotzdem gesperrt

Kategorie gesperrt + Vererbung inaktiv

Kategorie "News" (Status: gesperrt)
  ├─ Artikel "News 1" (Status: online) → aufrufbar
  ├─ Unterkategorie "Archiv" (Status: online) → aufrufbar

Search It Integration

// Automatisch registriert in boot.php
Accessdenied::initializeSearchItPrevention();

// Extension Point Handler
rex_extension::register('SEARCH_IT_INDEX_ARTICLE', 
    [Accessdenied::class, 'preventSearchItIndexing']);

// Logik
if ($article->getValue('status') == 2) {
    return false; // Artikel nicht indexieren
}
if ($inherit && $cat->getClosest(fn($cat) => 2 == $cat->getValue('status'))) {
    return false; // Artikel in gesperrter Kategorie nicht indexieren
}

Hinweise

⚠️ Search It: Index nach Sperrung neu generieren für konsistente Suchergebnisse

⚠️ Multi-Domain: REDAXO-Benutzer muss unter jeweiliger Domain eingeloggt sein (Issue #22)

⚠️ Deinstallation: Alle gesperrten Artikel werden automatisch auf “offline” gesetzt

⚠️ Preview-Link-Sicherheit: Link-Parameter ist vorhersehbar - nutze starke Artikel-IDs oder Custom-Parameter


Verwandte Addons


GitHub: https://github.com/FriendsOfREDAXO/accessdenied