Stefanie Simon: Passwortgeschützter Bereich

Guten Morgen!

Ich habe das Problem, dass bestimmte Bereiche der Website nur mit Passwort zugänglich sein sollen. Gleich beim Aufruf der Website erfolgt der Login.

Ich habe versucht das Problem mit Hilfe von Sessions zu lösen, leider noch ohne Erfolg.

Ausprobiert habe ich 2 Varianten:
1. Variante:

login.php
-----------
session_start();
$_SESSION['sess_user'] = $user;

geschützt.php
---------------
mit Hilfe von echo $_SESSION['sess_user']; wollte ich zu Testzwecken den Inhalt der Session ausgeben. Auch hier war die Session schon leer.

2. Variante:

login.php
------------
session_start();
session_register("user");

geschuetzt.php
---------------
session_start();
if (!session_is_registered('user'))
{
die ("Sie müssen sich einloggen!");
}

Auch diese Variante war leider nicht von Erfolg geprägt.

Kann mir vielleicht jemand weiterhelfen?

Mfg
Steffi

  1. echo $begrüßung;

    Ich habe versucht das Problem mit Hilfe von Sessions zu lösen, leider noch ohne Erfolg.
    Kann mir vielleicht jemand weiterhelfen?

    Du solltest dein Problem beschreiben. Anhand von Code kann man sehen, was du geschrieben hast, aber nicht zwangsläufig was du damit erreichen wolltest.

    Das Registrieren von Variablen in der Session ist veraltet und sollte nur noch für PHP < 4.1.0 verwendet werden. Greife über das $_SESSION-Array auf die Werte zu, bzw. lege sie in diesem Array ab.
    Siehe http://de.php.net/manual/en/ref.session.php Beispiele 1 und 2. (Das Beispiel 3 verwendet das veraltete Registrieren.)

    echo "$verabschiedung $name";

    1. Du solltest dein Problem beschreiben. Anhand von Code kann man sehen, was du geschrieben hast, aber nicht zwangsläufig was du damit erreichen wolltest.

      Auf einer Seite sind bereits alle Links zu sehen, auch wenn man nicht eingeloggt ist. Klickt man jedoch im unangemeldeten Modus auf einen der Links erscheint eine Fehlermeldung, dass man sich zuerst einloggen muss.
      Bin ich jedoch erfolgreich eingeloggt, soll eine Session gestartet werden. Und in der betroffenen .php-Datei soll auf ungleich null der Session abgefragt werden. Ist die Session ungleich null, dann sollen die gewünschten Daten angezeigt werden.

      Ich hoffe ich konnte das Problem einigermaßen beschreiben.

      Mfg
      Steffi

      1. echo $begrüßung;

        Du solltest dein Problem beschreiben. Anhand von Code kann man sehen, was du geschrieben hast, aber nicht zwangsläufig was du damit erreichen wolltest.

        Auf einer Seite sind bereits alle Links zu sehen, auch wenn man nicht eingeloggt ist. Klickt man jedoch im unangemeldeten Modus auf einen der Links erscheint eine Fehlermeldung, dass man sich zuerst einloggen muss.
        Bin ich jedoch erfolgreich eingeloggt, soll eine Session gestartet werden. Und in der betroffenen .php-Datei soll auf ungleich null der Session abgefragt werden. Ist die Session ungleich null, dann sollen die gewünschten Daten angezeigt werden.

        Ich hoffe ich konnte das Problem einigermaßen beschreiben.

        Mit PHP kann man HTML-Quelltext erzeugen. Was ein Konsument dieses HTML-Codes daraus macht, z.B. Links, Tabellen, etc., ist für PHP nicht von Belang.
        Aus Sicht von PHP möchtest du eine Session eröffnen.

        session_start();

        Ob eine neue eröffnet wird oder ob eine alte Session weitergeführt wird muss dich erstmal nicht kümmern. session_start() steht vor allen Ausgaben. Weder HTML-Code noch Leerzeilen/-zeichen außerhalb von PHP-Blöcken dürfen vorhanden sein. (Das hast du sicher schon beachtet.)

        Nun musst du nur in Abhängigkeit eines erfolgreichen Logins einen Eintrag im $_SESSION-Array vornehmen. Beispielsweise so:

        $_SESSION['angemeldet'] = true;

        Und an anderer Stelle musst du nur abfragen, ob dieser Wert vorhanden ist[1] und ob er true ergibt.

        if (isset($_SESSION['angemeldet']) and $_SESSION['loggedin'])
            // user ist angemeldet
          else
            // user ist nicht angemeldet

        echo "$verabschiedung $name";

        [1] Wenn er nicht vorhanden ist ergibt das sonst eine Notice, wenn das error_reporting auf E_ALL steht. Das (error_reporting) ist immer eine gute Idee ist, wenn man PHP-Scripte entwickelt.

        1. Hi!

          Und an anderer Stelle musst du nur abfragen, ob dieser Wert vorhanden ist[1] und ob er true ergibt.

          if (isset($_SESSION['angemeldet']) and $_SESSION['loggedin'])

          Ich frage hier immer ab, ob er nicht leer ist, also in diesem Fall

          if (!empty($_SESSION['angemeldet']))

          im übrigen hast du oben zwei unterschiedliche Variablen abgefragt.

          Gruß aus Iserlohn

          Martin

          1. echo $begrüßung;

            if (isset($_SESSION['angemeldet']) and $_SESSION['loggedin'])
            Ich frage hier immer ab, ob er nicht leer ist, also in diesem Fall
            if (!empty($_SESSION['angemeldet']))

            Ja, in dem Fall bekommt man mit empty() auch das gewünschte Ergebnis.
            Ich verwende empty() praktisch nicht mehr, weil es nicht zwischen "Variable nicht vorhanden" und "Variableninhalt ergibt false" unterscheidet. Außerdem hatte ich in Erinnerung, dass es mir Notices warf, was ich aber eben grad nicht mehr nachvollziehen konnte...

            im übrigen hast du oben zwei unterschiedliche Variablen abgefragt.

            Das war ein kleiner Aufmerksamkeitstest. Du hast ihn bestanden :-)
            (Dass ich im Nachhinein den Namen geändert und eine Stelle übersehen habe, muss ich ja nicht zugeben.)

            echo "$verabschiedung $name";

            1. Hi!

              Ich verwende empty() praktisch nicht mehr, weil es nicht zwischen "Variable nicht vorhanden" und "Variableninhalt ergibt false" unterscheidet.

              empty() verwende ich auch kaum, !empty() dafür aber umso lieber ;-)

              Außerdem hatte ich in Erinnerung, dass es mir Notices warf, was ich aber eben grad nicht mehr nachvollziehen konnte...

              Deine Erinnerung trügt (oder es war nur in früheren Versionen so).

              Gruß aus Iserlohn

              Martin

  2. Hallo Stefanie,

    Du kannst die Aufgabe entweder hierarchisch oder objektorientiert lösen.

    Bei der hierarchischen Lösung kümmert sich eine übergeordente Instanz, also hier der Webserver, um die Zugangsrechte. Die einzelnen Dokumente benötigen keine Veränderung.

    Bei der objektorientierten Lösung kümmert sich jedes Dokument selber um seinen Schutz. Es muss also frühzeitig einen Mechanismus geben, der innerhalb des Scriptes den Besucher erkennt und feststellt, ob der Inhalt das weiterten Dokumentes für ihn zugänglich sein soll.

    Die Session hat im ersten Schritt nichts mit den Zugangsrechten zu tun, sondern dient ausschließlich der Wiedererkennung des Besuchers. Es wäre daher auch möglich, eine Session grundsätzlich zu starten oder wiederaufzunehmen.

    Wenn in der Session dann eine bestimmte Variable nicht gesetzt ist, kannst Du z.B. mittels Umleitung (header()) auf die Anmeldeseite umleiten, sofern für den Besuch der betroffenen Seite eben eine Anmeldung erforderlich ist. Nach erfolgreicher Anmeldung könntest Du mit ebensolcher Umleitung wieder auf die ursprüngliche Seite zurückverweisen.

    Damit das klappt, muss der Browser allerdings Umleitungen akzeptieren, was aber mMn alle üblichen Browser tun. Außerdem darfst Du vor der Umleitung keinerlei Ausgaben tätigen, oder aber musst sie mittels ob_start() zurückhalten, bis die header fertig aufgebaut sind.

    LG
    Chris