Benutzer/Login Frage/Denkanstoss

morgenstern

Erfahrenes Mitglied
Ich habe ein Login System geschrieben, Session basierend. Es funktioniert alles tadellos. Nun möchte ich aber, dass ein Loginname nur einmel gleichzeit benutzt werden kann, also dass nicht mehrere User gleichzeitig mit ein und dem selben Account eingeloggt sein können.

Wie soll ich an diese Sache heran gehen?

Ich dachte mir ich setze ein Feld in der MySQL Datenbank in der Usertabelle auf einen bestimmten Wert, dass das Login Script erkennt, da ist schon einer mit dem Namen angemeldet, und wirft eine Fehlermeldung aus.

Dieses feld wird beim Logout einfach zurück gesetzt. Nur was passiert wenn der User das Browser Fenster schliesst? Wie lange bleibt eine Session bestehen, und wie kann ich den Feldinhalt beim Schliessen des Browsers verändern lassen?

Oder habt Ihr eine ganz andere Möglich im peto?

thx im voraus
 
Problem: 1x einloggen:

Du speicherst bei jedem Klick auf deine Seite den eingeloggten User die Zeit (per mktime()) in der Datenbank. Wenn sich nun ein anderer einloggen will aber die Zeit die wir per mktime ermittelt haben kleiner ist als z.B. 2 Minuten, kann er sich nicht einloggen, da vermutet wird, dass der Benutzer noch aktiv ist.

Wenn ein User länger auf einer Seite ist(als 2 Minuten), erneuerst du die Seite per Meta alle 3 bis 4 Minuten. Das ist die beste Gewährleistung.

Problem: Sesseion:
Die Session ist nur solange aktiv, wie das Browserfenster aktiv ist. Also wenn du mit dem Browserfenster auf einer anderen Seite klickst die nicht dir gehört exisitert die laufende Session nur solange wie es in der php.ini eingestellt ist, es sei denn du hast es per @ini_set("session_lifetime", ZeitinSekunden) verändert.

Du kannst maximal beim Schliessen des Fensters ein PopUp öffnen lassen, um die aktuelle Session zu zerstören. Dies geht per body Objekt onUnload.
Empfehle ich aber nicht, da es ein unerwünschter PopUp ist und wer ein PopUp Blocker hat ist das Script eh machtlos.

In diesem Sinne
 
Zu den Sessions:

Die Session wird beim schließen des Browsers beendet.

Zu dem Login:

Also das ein User sich nur einmal einloggen kann, könntest du meiner Meinung nach mit einer Datenbank regeln in der alle momentan eingeloggten Benutzer gespeichert werden. Dann kannst du ja abfragen ob der Benutzer schon eingeloggt ist oder nicht. Und demnach eine Meldung ausgeben.

Für den Fall das der Benutzer sich nicht ordnungsgemäß ausloggt kannst du ja die Datenbank alle 15 Minuten testen, ob der Benutzer noch eingeloggt ist oder nicht. Ist das nicht der Fall wird er gelöscht. Andernfalls hat er eine 15 Min. Login Sperre.

Das ist jetzt nicht alles wirklich durchdacht sonder nur eine Idee, wie es ein Lösungsansatz sein könnte.

Gruß Mirko
 
Ich würde die Idee von Mirko dahingehend ausbauen, dass du bei jeder Aktivität des Nutzers in der DB ein Feld mit der UNIX-Timestamp aktualisierst.
Zeitgleich schuast du bei jdem Aufruf ob diese Timestamp älter als beispielsweise 15 Minuten ist und kannst ihn somit auch gleich rauswerfen o.ä.

@Mirko: Die session ist auch nach schliessen des Browsers aktiv. Du kannst gerne mal ne SessionID von irgendeiner Seite auf der du eingeloggt bist nehmen, aufschreiben, Browser schliessen, aufmachen und den Link von der Sitzung davor nehmen....
 
Gut die Theorie verstehe ich. Nur wie automatisiere ich diesen Vorgan, dass ein Eintrag mit einer Timestamp überprüft wird? Das geht doch nur wenn ein user gerade etwas ausführt.

ALso müsste ich wohl bevor der suer sich einloggt seine Daten (die er beim login-forumlar eingeben hat) her nehmen und in der Tabelle überprüfen ob dieser user online ist, und ob der Unterschied zwischern der jetzigen Zeit und der Timestamp länger als ein bestimmter Betrag ist, richtig?
 
Also insgesamt lehnt sich das ganze sehr stark an ein UserOnline-Script an. Dazu gibt es hier auch ein Tutorial. Du brauchst eigentlich nur noch eine Abfrage schreiben ob ein bestimmter Benutzer in der Tabelle vorhanden ist. Zusätzlich würde ich noch die IP zum Zeitstempel in der Datenbanktabelle speichern, ganz einfach mit folgendem Hintergrund: Nehmen wir an du hast 5min eingestellt eh angenommen wird, dass der Benutzer nicht mehr eingeloggt ist. Jetzt hat sich der Wert in der Datenbank gerade erneuert. Danach schließt der Benutzer das Browserfenster und macht ein neues auf um sie wieder einzuloggen. Geht dann aber nicht, da noch keine 5min um sind. Ich würde es nur verweigern lassen wenn noch ein Benutzer drinsteht, der eine andere IP hat.
 
Klingt logisch, blöd ist wenn er eine dynamische ip hat, und sich neu einwählen hat müssen ;D

Ja ist ein Extrembeispiel, ich weiss.

Gut ich werde es mal testen, falls es nicht hinhaut melde ich mich einfach wieder , danke für die Hilfen, mfg morgenstern
 
Mh, mein Ansatz dazu, dass keine zwei Leute angemeldet sein dürfen ist folgender:

Loggt man sich ein, so wird ein Feld im Benutzereintrag gleich session_id() gesetzt. Bei jedem Aktualisieren überprüft das Script dann, ob die aktuelle SID der in der DB entspricht und, sollte dies nicht der Fall sein, wirft den Benutzer heraus.

Das verweigert zwar keinen Login, wenn jemand anderes bereit eingeloggt ist, stellt aber sich, dass immer nur einer gleichzeitig online sein kann. :rolleyes:
 
Dies verhindert dann allerdings die Verwendung von session_regenerate_id() zur Erhöhung der Sicherheit gegen Sessionhijacking...
 
Zurück