Ik ben sipke jan sangers en loop stage bij een bedrijf in drachten. Ik moet een applicatie maken met php. Hierin kunnen gebruikers inloggen.
Het probleem is dat de gebruiker maar 1 keer ingelogd mag zijn. Met een session's is dit bijna niet op te lossen geloof ik en als je een boolean in een database bijhoudt, moet die veranderd worden na uitloggen.
Dit werkt wel, maar als de gebruiker de browser dichtdoet of de session heeft een timeout, kan de gebruiker al niet meer inloggen omdat de boolean gezet is.
Weten jullie hier een oplossing voor?, het hoeft niet beslist via een database te gaan, ik sta overal voor open.
Session-id's zijn uniek, het heeft dus geen zin om deze in de database op te slaan. Verder zou ik niet weten hoe je met 100% zekerheid er voor kunt zorgen dat een gebruiker slechts 1x is aangelogd. De enige manier is om gebruikers te dwingen om netjes af te loggen. In dat geval kun je bij het aanloggen een vinkje zetten bij 'aangelogd' en deze weer verwijderen wanneer iemand uitlogd. Probleem is alleen dat 9 van de 10 gebruikers niet netjes afloggen... En wat ga je daar mee doen? Eens per dag een cronjob draaien om alle gebruikers alsnog af te loggen is een mogelijke workaround, maar het blijft behelpen.
Je kan zo'n session ID in de database opslaan, en ook neerzetten of iemand is ingelogd of niet. Stel dat iemand in wil loggen die al is ingelogd, dan ziet het systeem dat de gebruiker is ingelogd, en met welk sessie['id'] dat was. Je kan (mits deze sessie nog beschikbaar is) deze teruggeven aan de gebruiker en anders een andere aanmaken.
?
Onbekende gebruiker
25-11-2005 16:09
Robert Deiman
hallo, heb je al eens gekeken naar wat het session ID nou eingelijk is?, als je 2 browsers zou openen, heb je al 2 verschillende session id's. je kan wel neerzetten of iemand is ingelogd, je kunt niet neerzetten of hij niet is ingelogd.
Als je denkt dat je wel een oplossing hebt, zou je dit misschien kunnen uitwerken en de oplossing dan posten. Ik heb trouwens niet een voorkeur voor cookies, omdat die client-sided zijn.
Is er geen workaround mogelijk via de combinatie JavaScript - PHP? JavaScript kent een onUnload event en je kunt er ook een form mee submitten waarin je de uservariabelen opslaat om de user uit te kunnen loggen
<body onUnload="uitlog_form.submit ();">
Probleem is dan natuurlijk wel dat je dat op elke pagina moet doen, en elegant is anders.
@Jan: het onunload event zou ik niet toepassen, want zodra men dan een andere pagina aanvraagt wordt het unload-event van de eerste aangeroepen en is men dus ... precies ;)
Je kunt overwegen om een custom-session-handler het hele sessie gebeuren zodanig af te stellen dat de 'garbage-collection-time' kort is (bv 2 minuten) en dat met een javascript via een XMLHTTPRequest iedere minuut een bestand wordt aangeroepen.
Dit bestand hoeft geen hmtl-code te bevatten, maar houd wel de sessie aktief omdat je browser bij zo'n request de sessie-id meestuurt.
Aan de hand van die sessie-id wordt de sessie dus weer 2 minuten verlengd.
Ander voordeel van de custom-session-handler is dat je ook andere informatie op kunt slaan zoals bv een gebruiker-id.
Is er al een sessie aktief met die gebruiker-id dan kun je het inloggen stoppen en de bezoeker hiervan in kennis stellen.
?
Onbekende gebruiker
26-11-2005 16:59
Klinkt interresant willem
ik zal hier wel even wat mee proberen (na het weekend natuurlijk), bedankt alvast
?
Onbekende gebruiker
29-11-2005 16:10
gewijzigd op 29-11-2005 17:31
Ik ben even aan de slag geweest met custom_session-handlers en denk dat ik er nu wel uit kom, ik sla alle gegevens van alle session's op zodat ik kan zien wie in gelogd is. De garbage collection kan ik zelf instellen, wanneer een sessie langer dan ene bepaalde tijd niet gebruikt is en daarna wordt de site weer bezocht (script wordt uitgevoerd) verwijderd hij alle verouderde sessie's
Ik ben er nog even mee bezig geweest. En met javascript kun je bijhouden of de browser gesloten is/wordt. Als dit gebeurt redirect ik naar een sessiondestroy.php waar de sessie gedestroyed wordt en daarna hetzelfde scherm.
Omdat ik bij de destroy de sessie uit de database wordt gehaald is het probleem opgelost :)
Nogmaals bedankt voor het wijzen in de juist richting ;)