You are not logged in.

wcf.regNote.message

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

1

Saturday, April 11th 2009, 10:09am

Wie kann ich Benutzer nach XXX Minuten automatisch ausloggen und doppeltes Einloggen verhindern

Ich habe mir vor einiger Zeit schon mal ein eigenes kleines Skript geschrieben mit dem ich bei Systemen die ich erstelle eine Benutzerverwaltung einbinden kann. Das heißt Benutzer können sich registrieren, einloggen und anhand des Logins steuere ich dann gewisse Funktionen auf der Seite. Es gibt auch noch eine Tabelle in der ich Berechtigungsstufen nutzen kann um z.B. einem Benutzer das Recht geben zu können gewisse dinge zu sehen aber nicht zu verändern und so.

Jetzt möchte ich das ganze gerne so erweitern, dass wenn ein Benutzer 15 Minuten inaktiv war er sich neu einloggen muss und die Session auch gekillt wird. Genügt es jede Aktivität mit einem Timestamp in die Sessionstable zu packen und wenn mehr wie 15 Minuten seit der letzten Aktion vorüber sind den Nutzer einfach auszuloggen als hätte er selbst auf Logout geklickt oder gibts da ne elegantere Methode?

Außerdem hätte ich auch gerne das ein Nutzer wirklich nur ein mal eingeloggt sein kann. Das heißt wenn er sich einloggt soll der Login für den Nutzer gesperrt sein bis er sich ausloggt. Damit möchte ich verhindern das ein Benutzer mit hoher Berechtigung versehentlich auf einem PC eingeloggt ist und dann noch auf einem zweiten Aktiv wird ohne den vorherigen PC zu überwachen. Bei einem Projekt ist es jetzt vorgekommen, dass ein Benutzer etwas sehen konnte was nicht für seine Augen gedacht war eben wegen diesem Problem. Kann sich ein Nutzer nur auf einem PC einloggen ist er gezwungen dran zu denken sich auszuloggen bevor er die Arbeitsstation wechselt. Nur wie fange ich das ab am besten noch ohne Cookies?
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Artanis

Beginner

Posts: 22

Location: VR

Occupation: Systementwickler

  • Send private message

2

Sunday, April 12th 2009, 11:41am

Ich hattemal das gleiche Prob und habe dafür eine simplöe Lösung gefunden.
Nach dem Login wird die Session des Users, seine letzte Aktivität und seine UserID (Oder irgendwas eindeutiges vom User) inder Datenbank gespeichert.
Also eine Tabelle mit den Spalten
- id (Ich hab immer eine Standard-Id, auch wenn die userid den selben Zweck erfüllt ;))
- userid
- sessionid
- timestamp
Bei jeder seiner Aktionen musst du mit Hilfe der SessionId in der Datenbank den User finden und das aktuelle Datum mit dem Datum aus der DB vergleichen. Liegen da 15 min. zwischen, kriegt er eine Login-Seite und der DB-Eintrag wird gelöscht. Wenn nicht, dann kann er weitermachen und sein Timestamp wird erneuert.
Wenn er sich nun nochmal einloggen will, kommst du durch die userdaten schnell auf die UserId und siehst, dass er schon eingeloggt ist --> Login verweigern
Wenn er sich ausloggt, schmeißt du einfach seinen Datenbankeintrag wieder raus.
:cbcool:

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

3

Sunday, April 12th 2009, 11:57am

Das mit dem Timestamp hatte ich mir auch schon so überlegt nur ich dachte es gibt irgendwie was standardmäßiges wie "sessionage" oder sowas was ich abfragen kann und dann bei 15 Minuten inaktivität automatisch nen logout oder so. Naja aber die Lösung mit dem Timestamp erfüllt ja den Zweck das soll dann mal egal sein.
Das zweite mit dem Login verhindern wenn er den PC wechselt hab ich nicht so ganz verstanden. Wie soll ich denn wenn der User an einen anderen Rechner geht prüfen ob er eingeloggt ist? Seine Userdaten sind ja erst nach dem Login verfügbar und nicht schon vorher sonst hätte ja jeder Gast zugriff auf alles.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Artanis

Beginner

Posts: 22

Location: VR

Occupation: Systementwickler

  • Send private message

4

Sunday, April 12th 2009, 12:06pm

Nochmal zum doppelten Login das Beispiel:
User kommt auf die Seite und gibt seine Daten an. Er wird als User mit der userid 123 identifiziert.
In der Datenbank wird in der.. Ich nenn sie mal "sessiontabelle" nachgeschaut. Die Tabelle ist leer. Der User wird eingeloggt und die Daten in die sessiontabelle eingetragen.
Kurz darauf kommtdem sein hinterhältiger Kollege als Gast von einem anderen Rechner auf die Seite. Er kennt die Logindaten und will sich einloggen.
Er gibt die Logindaten an, das System erkennt den User, schaut in die sessiontabelle und findet bereits einen Eintrag, wo die UserId drinsteht. Der Kollege wird rausgekantet.
Der Zweite User muss erstmal seine Userdaten angeben, bevor geprüft werden kann, ob er schon eingeloggt ist. (Nach welchem User soll sonst gesucht werden) Er kriegt aber keine "Vielen-dank-für-ihren-Besuch-mr.XY-Seite" sondern eine "Sie-sind-bereits-eingeloggt-Seite"
:cbcool:

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

5

Tuesday, April 14th 2009, 10:11am

Ich hab beides jetzt umgesetzt und es funktioniert beides einwandfrei. Netter Nebeneffekt ist noch das ich jetzt dem User anzeigen lassen kann wann er zuletzt da war. Und da ich so oder so noch vor habe ein "User Log" zu erweitern in dem ich alle Handlungen des Users festhalte ist das auch schon ein Ansatz dafür. Ich hab mir jetzt schon eine zusätzliche Tabelle gemacht in welcher ich die Login Zeiten der User speichere und so schon mal abrufen kann wann welcher User eingeloggt war. Jetzt muss ich nur noch pro Seite die er aufruft einen Eintrag erzeugen alla "Auswertung aufgerufen" oder "Datenerfassung aufgerufen" und dann ist mein Log auch schon fertig.

Einzig der Admin Bereich ist jetzt noch ein Problem aber das ist ein anderes Thema.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

davil

Beginner

Posts: 36

Location: Wien

Occupation: Entwickler

  • Send private message

6

Tuesday, April 14th 2009, 3:45pm

Der saubere Weg sowas zu lösen ist ganz einfach: bevor überhaupt irgendeine Aktion gestartet oder jemand authentifiziert wird, wird die DB aufgeräumt, d.h. man schmeißt per "DELETE FROM sessiontabelle WHERE lastvisittimestamp < $timestampvorXstunden" alle Zeilen raus, die nicht mehr aktuell sind. Damit hält man sich auch die DB sauber weil alte Sessions nicht ewig aufgehoben werden.

Nach dem Aufräumen kann man ganz einfach schauen ob ein Eintrag zur Session existiert, und wenn ja, dann ist er auch sicher "jung" genug. Auf die anderen Punkte möchte ich jetzt sonst nicht eingehen, da es ja eh funktioniert, wollte nur die "best practice" an den mann/frau bringen.
~~~ ihr seid alle krank! ~~~ :D

Artanis

Beginner

Posts: 22

Location: VR

Occupation: Systementwickler

  • Send private message

7

Wednesday, April 15th 2009, 1:07pm

Richtig! Das mit dem Aufräumen habe ich vergessen und ist nicht zu verachten.
So kannst du dir dann auch eine "Wer ist gerade online?"- Liste ausgeben lassen (:
Freut mich, dass alles so geklappt hat
:cbcool:

Prometheus

Administrator

  • "Prometheus" started this thread

Posts: 3,278

  • Send private message

8

Friday, April 17th 2009, 11:20am

Das mit dem Bereinigen der Session Table hatte ich vorher eh schon drin. Das war eigentlich klar das man das machen sollte. Deshalb hab ich ja auch die zusätzliche Tabelle für meine Logs. Und auch diese räume ich am 1ten jeden Monat auf und speichere die Logs in einer Textdatei. Klappt auch alles bestens.
Jedwege Anfragen bitte an Technomausi oder ShaoKhan richten. Dieses Konto ist und bleibt inaktiv.

Similar threads

wcf.user.socialbookmarks.titel