Contao-Camp 2024
Ergebnis 1 bis 33 von 33

Thema: Im Template überprüfen ob als Admin angemeldet

  1. #1
    Jayster
    Gast

    Standard Im Template überprüfen ob als Admin angemeldet

    Ich würde gerne in einem Template überprüfen, ob der Seitenaufrufer parallel als Admin im Backend eingeloggt ist. Das brauche ich, da ich schnell ein JavaScript einbauen möchte, das nur dann drin ist, wenn man aktuell nicht als Admin eingeloggt ist. Ähnlich wie im Template "analytics_google.html5". Dort wird die Konstante BE_USER_LOGGED_IN verwendet. Ich muss allerdings zusätzlich noch wissen, ob der Nutzer ein Admin ist.

    Es gibt dazu auch einen Eintrag in der Dokumentation: https://docs.contao.org/books/cookbo...epruefung.html

    Ich habe es mit folgendem Code versucht, der aber leider nicht funktioniert:
    PHP-Code:
    objUser = \BackendUser::getInstance();
    if (!isset(
    $user) || !$user->isAdmin) {
        
    // ...

    Eine Ausgabe mit zum Beispiel "var_dump(objUser->id);" gibt NULL zurück.

    Es scheint, als würde es so nicht gehen. Gibt es eine Lösung dafür?
    Geändert von Spooky (16.11.2017 um 15:41 Uhr)

  2. #2
    Contao-Nutzer Avatar von Ling
    Registriert seit
    09.04.2010.
    Ort
    Tübingen
    Beiträge
    57

    Standard

    Hm, im Zweifel könntest du dir ein eigenes Insert-Tag bauen und damit den Admin-Status prüfen. Hiermit dann https://docs.contao.org/books/cookbo...s-admin-status

  3. #3
    Contao-Urgestein Avatar von cliffparnitzky
    Registriert seit
    08.10.2010.
    Ort
    Lüneburg
    Beiträge
    2.450
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Zitat Zitat von Jayster Beitrag anzeigen
    ...
    Ich habe es mit folgendem Code versucht, der aber leider nicht funktioniert:
    PHP-Code:
    objUser = \BackendUser::getInstance();
    if (!isset(
    $user) || !$user->isAdmin) {
        
    // ...

    ...
    Da fehlt das "$"-Zeichen bei der Variable und dann wird eine falsche Variable genutzt.
    Müsste also eher so aussehen:
    PHP-Code:
    $objUser = \BackendUser::getInstance();
    if (!isset(
    $objUser) || !$objUser->isAdmin) {
        
    // ...

    Um erstmal alles zu zeigen wäre dann ein "var_dump($objUser->id);" richtiger.

  4. #4
    Jayster
    Gast

    Standard

    @cliffen: Danke für den Hinweis. Da sind mir beim kopieren bzw. neu hier reinschreiben ein paar Dollarzeichen verloren gegangen. Hier nun nochmal mein Code mit den Dollarzeichen:
    PHP-Code:
    <?php
    $objUser 
    BackendUser::getInstance();

    if (
    $objUser->isAdmin) {
        echo 
    'test';
    }

    var_dump($objUser->id);
    ?>
    Es besteht leider immer noch das Problem: 'test' wird nicht ausgegeben und $objUser->id ist NULL.

    @Ling: Danke für die Idee mit dem Inserttag. Falls es im Template nicht möglich ist, wäre das eine Alternative.

    Ich finde es aber etwas merkwürdig, dass es im Template nicht mit dem Code von oben geht. Mir fällt eigentlich kein Grund ein, wieso nicht.

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    PHP-Code:
    <?php

    $objUser 
    = \BackendUser::getInstance();
    if (
    BE_USER_LOGGED_IN && $objUser->authenticate() && $objUser->isAdmin)
    {
        
    // ...
    }
    Hintergrund warum zusätzlich BE_USER_LOGGED_IN verwendet wird: BackendUser::authenticate leitet automatisch auf die Login Seite vom Contao Backend weiter, wenn kein Backend User authentifiziert werden konnte. Daher muss man in der Bedingung vorher noch auf BE_USER_LOGGED_IN prüfen (welches true ist, wenn das entsprechende Backend Login Cookie gesetzt ist) um den Redirect zu verhindern, wenn kein Backend User angemeldet ist.
    Geändert von Spooky (15.11.2017 um 09:55 Uhr)

  6. #6
    Contao-Nutzer Avatar von Ling
    Registriert seit
    09.04.2010.
    Ort
    Tübingen
    Beiträge
    57

    Standard

    Zitat Zitat von Jayster Beitrag anzeigen
    Ich finde es aber etwas merkwürdig, dass es im Template nicht mit dem Code von oben geht. Mir fällt eigentlich kein Grund ein, wieso nicht.
    Ich denke mal das die Klasse BackendUser im FE nicht ohne weiteres verfügbar ist.

  7. #7
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Zitat Zitat von Ling Beitrag anzeigen
    Ich denke mal das die Klasse BackendUser im FE nicht ohne weiteres verfügbar ist.
    Alle Contao Klassen sind überall verfügbar.

  8. #8
    Jayster
    Gast

    Standard

    @Spooky: Danke für den Hinweis.

    Irgendwas scheint jedoch merkwürdig zu sein. Es funktioniert immer noch nicht. Nun habe ich mir zum Test mal einfach folgendes ausgeben lassen:
    PHP-Code:
    var_dump(BE_USER_LOGGED_IN); 
    Dabei kommt "false" heraus, obwohl ich im Contao Backend eingeloggt bin. Ich habe die gleiche Ausgabe auch im Google Analytics Template getestet ("analytics_google.html5"), da die Konstante dort auch verwendet wird. Dort wird ebenfalls "false" ausgegeben.

  9. #9
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Bist du auch als Frontend User angemeldet?

  10. #10
    Jayster
    Gast

    Standard

    Nein, nur als Backend Nutzer.

  11. #11
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Verwendest du den Page Cache?

  12. #12
    Jayster
    Gast

    Standard

    Auch das nicht. Ich habe gerade auch nochmal zur Sicherheit die Seite in der Seitenstruktur auf "nicht cachen" gestellt.

  13. #13
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Verwendest du verschiedene Domains? Also bist du im Backend unter einer anderen Domain angemeldet, als du im Frontend testest?

  14. #14
    Jayster
    Gast

    Standard

    Auch das nicht. Ich habe es in meiner lokalen Installation getestet, da habe ich im Startpunkt gar keine Domain eingetragen.

    Hat mal jemand anders
    PHP-Code:
    var_dump(BE_USER_LOGGED_IN); 
    im Google Analytics Template getestet?

  15. #15
    Contao-Nutzer Avatar von Ling
    Registriert seit
    09.04.2010.
    Ort
    Tübingen
    Beiträge
    57

    Standard

    Hab's mal bei mir lokal in ein Template eingebaut und bekomme auch "false" raus obwohl ich im BE als Admin angemeldet bin.

  16. #16
    Jayster
    Gast

    Standard

    @Ling: Danke für das Testen.

    Da scheint was nicht in Ordnung zu sein. Man kann im Frontend scheinbar nicht richtig auf den Backend Nutzer Zustand zugreifen.

  17. #17
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

  18. #18
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Übrigens, Contao 3 oder 4?

  19. #19
    Jayster
    Gast

    Standard

    Contao 3.

  20. #20
    Jayster
    Gast

    Standard

    Aus den Kommentaren im Issue schließe ich, dass es nicht möglich ist, einfach im Template auf den Backend Nutzer zuzugreifen. Weder mit BE_USER_LOGGED_IN noch \BackendUser::getInstance().

  21. #21
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Doch, mit
    PHP-Code:
    <?php

    $objUser 
    = \BackendUser::getInstance();
    if (
    $objUser->authenticate() && $objUser->isAdmin)
    {
        
    // ...
    }
    sollte es funktionieren. Nur leitet dich das auf die Contao Login Seite weiter, falls sich kein Backend Nutzer angemeldet hat. Daher musst du auch feststellen, ob ein gültiges Backend Login Cookie da ist. Das geht in Contao 4 leichter, da es dafür eine eigene Funktion gibt. In Contao 3 musst du es manuell machen (siehe zB das google_analytics Template).
    Geändert von Spooky (17.11.2017 um 13:42 Uhr)

  22. #22
    Jayster
    Gast

    Standard

    Danke, so klappt es jetzt (fast):
    PHP-Code:
    if (sha1(session_id() . (!Config::get('disableIpCheck') ? Environment::get('ip') : '') . 'BE_USER_AUTH') == Input::cookie('BE_USER_AUTH')) {
        
    $objUser = \BackendUser::getInstance();
        if (
    $objUser->authenticate() && $objUser->isAdmin) {
          echo 
    'admin';
        }

    Gibt allerdings noch Warnungen in dieser Form:
    Code:
    Warning: mysqli::real_escape_string(): Couldn't fetch mysqli in system\modules\core\library\Contao\Database\Mysqli\Statement.php on line 51
    Warning: mysqli::query(): Couldn't fetch mysqli in system\modules\core\library\Contao\Database\Mysqli\Statement.php on line 81
    Warning: Contao\Database\Mysqli\Statement::get_error(): Couldn't fetch mysqli in system\modules\core\library\Contao\Database\Mysqli\Statement.php on line 92
    Und einen Fatal Error:
    Code:
    Fatal error: Uncaught Exception: Query error: (UPDATE tl_user SET session='' WHERE id='') in C:\websites\contao-3.5.17\system\modules\core\library\Contao\Database\Statement.php:295 Stack trace: #0 C:\websites\contao-3.5.17\system\modules\core\library\Contao\Database\Statement.php(264): Contao\Database\Statement->query() #1 C:\websites\contao-3.5.17\system\modules\core\classes\BackendUser.php(164): Contao\Database\Statement->execute('a:37:{s:7:"refe...', '1') #2 [internal function]: Contao\BackendUser->__destruct() #3 {main} thrown in C:\websites\contao-3.5.17\system\modules\core\library\Contao\Database\Statement.php on line 295

  23. #23
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Wo setzt du diesen Code ein?

  24. #24
    Jayster
    Gast

    Standard

    Ich hab mir unter "templates" (im Contao Root) ein Template "j_admin_test.html5" angelegt und binde dieses im Seitenlayout ein (es geht um Javascript Code, der nur ein eingebunden werden soll, wenn man nicht als Admin eingeloggt ist).

  25. #25
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Hm.. ja komisch. Du könntest vor deinem Code noch ein
    PHP-Code:
    \Database::getInstance(); 
    einfügen.

  26. #26
    Jayster
    Gast

    Standard

    Das hat leider nicht geholfen.

  27. #27
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Poste den kompletten Stack Trace des Fatal errors.

  28. #28
    Jayster
    Gast

    Standard

    Meinst du das hier?
    Code:
    Fatal error: Uncaught Exception: Query error: (UPDATE tl_user SET session='' WHERE id='') in C:\websites\contao-3.5.17\system\modules\core\library\Contao\Database\Statement.php:295 Stack trace: #0 C:\websites\contao-3.5.17\system\modules\core\library\Contao\Database\Statement.php(264): Contao\Database\Statement->query() #1 C:\websites\contao-3.5.17\system\modules\core\classes\BackendUser.php(164): Contao\Database\Statement->execute('a:37:{s:7:"refe...', '1') #2 [internal function]: Contao\BackendUser->__destruct() #3 {main} thrown in C:\websites\contao-3.5.17\system\modules\core\library\Contao\Database\Statement.php on line 295

  29. #29
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Hm, ja verstehe. Da die BackendUser Instance erst nach der Database Instance angelegt wird, wird die Database Instance destructed, before die BackendUser Instance destructed wird - was dann zu diesem Fehler führt.

    Du müsstest dir also über tl_session die BackendUser ID holen und dann manuell über die Datenbank direkt abfragen, ob es sich um einen Admin handelt oder nicht. Sprich die einzelnen Schritte sind:

    1. Den richtigen Session Hash holen.
    2. Mit diesem Hash die Backend Session aus tl_session auslesen.
    3. Mit der pid der Session den Wert tl_user.isAdmin holen.

  30. #30
    Contao-Urgestein Avatar von Andreas
    Registriert seit
    19.06.2009.
    Ort
    Mönchengladbach
    Beiträge
    7.703
    User beschenken
    Wunschliste
    Contao-Projekt unterstützen

    Support Contao

    Standard

    Ich mach das bei mir immer so und das hat bisher immer funktioniert.
    PHP-Code:
    /** Extra admin FE CSS and JS if you are logged into BE */
    if(sha1(session_id().(!Config::get('disableIpCheck') ? Environment::get('ip') : '').'BE_USER_AUTH') == Input::cookie('BE_USER_AUTH'))
    {
      
    $GLOBALS['TL_HEAD'][]  = '<!-- templates/j_admin_test.html5 - TL_HEAD -->
        <link href="files/css/_my_fe.css" rel="stylesheet">'
    ;
      
    $GLOBALS['TL_BODY'][]  = '<!-- templates/j_admin_test.html5 - TL_BODY -->
        <script src="files/js/_my_fe.js"></script>'
    ;
    }
    /** */ 
    Ich benutze zwar das Feld "eigene Head Tags" mit dem Inserttag {{file::j_admin_test.html5}}, aber das dürfte ja eigentlich keinen Unterschied machen, oder?

    Edit: Ah, ok, sorry. Grad gesehen, da fehlt bei mir wohl auch noch der Check, ob der User im BE ein Admin ist. Das mit den \User Methoden hatte ich damals auch probiert, habe ich aber nie hinbekommen.
    Geändert von Andreas (17.11.2017 um 23:53 Uhr)
    Bitte!
    Vor Anfragen im Forum HTML validieren.
    Codesnippets hier im Froum sauber einrücken. Nur Tabs o. nur Leerzeichen verwenden.

    Vielen Dank an alle Wunschlistenerfüller
    Andreas Burg, Web Solutions

  31. #31
    Jayster
    Gast

    Standard

    Danke euch beiden, ich glaube, jetzt hab ich's.
    PHP-Code:
    $sessionHash sha1(session_id() . (!Config::get('disableIpCheck') ? Environment::get('ip') : '') . 'BE_USER_AUTH');

    if (
    $sessionHash == Input::cookie('BE_USER_AUTH')) {
        
    $db Database::getInstance();
        
    $user $db->prepare("
                SELECT admin
                FROM tl_user
                JOIN tl_session
                ON tl_user.id = tl_session.pid
                WHERE tl_session.hash = ?"
    )
            ->
    execute($sessionHash)
            ->
    row();
        
        if (
    $user && $user[admin] == 1) {
            echo 
    'admin';
        }


  32. #32
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    34.059
    Partner-ID
    10107

    Standard

    Oder
    PHP-Code:
        $admin $db->prepare("
                SELECT admin
                FROM tl_user
                JOIN tl_session
                ON tl_user.id = tl_session.pid
                WHERE tl_session.hash = ?"
    )
            ->
    execute($sessionHash)
            ->
    fetchColumn(); 

  33. #33
    Jayster
    Gast

    Standard

    fetchColumn() wirft mir folgenden Fehler:
    Code:
    Fatal error: Uncaught exception Error with message Call to undefined method Contao\Database\Mysqli\Result::fetchColumn() thrown in templates\theme-one\j_admin_test.html5 on line 14

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •