[php] Sessie logintijd afhankelijk maken van gebruikerskeuze

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • mahi
  • Registratie: Juni 2001
  • Laatst online: 22-09-2020

mahi

God bless GoT

Topicstarter
Ik heb reeds geruime tijd een loginsysteem met sessies voor m'n PHP content management systeem. De session_id wordt via een cookie opgeslagen op de client PC (de sessies zelf worden natuurlijk door PHP sessies afgehandeld).

Tot nu toe gebruikte ik:

session_set_cookie_params(0);

Om de logintijd in te stellen. Anders gezegd, de gebruiker blijft ingelogd tot deze z'n venster sluit of op de logout-link klikt (welke een session destroy doet). Dit werkt allemaal naar behoren voor zover ik kan zien, maar sommige gebruikers vragen of het niet mogelijk is om een optie te voorzien om ingelogd te blijven - ook nadat de browser afgesloten is zodat ze de volgende dag weer kunnen verder werken zonder telkens te moeten inloggen.

Op de login form komt dus een checkbox "Remember me" waarmee de gebruikers kunnen aanduiden of ze ingelogd willen blijven (pakweg een sessie van een maand als voorbeeld), of slechts ingelogd willen blijven zolang de browser open is.

Om een maandje ingelogd te blijven, zelfs wanneer de browser afgesloten is gebruik ik:

session_set_cookie_params(30 * 24 * 60 * 60);

Wat weer naar behoren werkt (ik heb het natuurlijk met een kortere tijd getest ;)).

Nu wat is het probleem? Die session_set_cookie_params wordt aan elk begin van m'n PHP scripts aangeroepen om de tijd opnieuw een maand in de toekomst te zetten (anders zou de login na een maand ook stoppen zelfs wanneer de gebruiker wel degelijk heel de tijd actief ingelogd was - dat is natuurlijk niet de bedoeling).

Maar hoe kan ik nu aan het begin van het script weten of ik session_set_cookie_params(0) moet nemen of session_set_cookie_params(30 * 24 * 60 * 60)? Hoe kom ik daar de keuze van de gebruiker te weten? Vlak na de login form zou het nog gaan door die variabele via de form door te geven, maar op volgende pagina's gaat dat niet - en zeker niet wanneer de user terug op de site komt na een weekje afwezigheid.

Ik kan de keuze wel in de sessievariabele opslaan, maar dan kan ik deze niet uitlezen. Ik kan pas aan de sessievariabele na session_start is aangeroepen. Mogelijk is de plaats van m'n session_set_cookie_params niet correct (maar het werkt alleszins toch correct), maar ik verkeer in de veronderstelling dat dit voor session_start aangeroepen moet worden.

Dus ik zit met een probleemsituatie. Ik ken de gebruikerskeuze pas na session_start, maar zou het ervoor moeten weten zodat ik de juiste keuze met session_set_cookie_params kan meegeven.

Een idee dat ik had (maar dat vooralsnog niet wil werken) is het gebruik van nog een client side cookie waarin ik die keuze opsla en welke ik uitlees voor de session_set_cookie_params. Maar ik doe of iets mis daarmee, of het werkt gewoonweg niet.

Hopelijk zijn er hier mensen die meer ervaring hebben met het schrijven van loginsystemen die dit probleem vroeger reeds aangepakt hebben en me kunnen helpen hierbij.

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

Ik heb er niet zoveel ervaring mee, maar je oplossing met een cookie lijkt me wel logisch en zou moeten werken. Heb je daar wat code van ofzo?

Acties:
  • 0 Henk 'm!

Verwijderd

denk dat daat de session_get_cookie_params() functie voor is

http://nl3.php.net/manual...ion-get-cookie-params.php

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Je kunt van cookies de geldigheidsduur uitlezen, als ik me niet vergis.
Zo niet, dan zet je gewoon nog een extra cookie die aangeeft dat de user ingelogd wil blijven oid.

Als je meer info over je systeem geeft kan ik misschien betere oplossingen geven...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Mark Wegener
  • Registratie: December 2001
  • Laatst online: 14-09 15:52
ik heb iets dergelijks als volgt gedaan. ik weet niet of het bij jou toepasbaar is, maar goed.

* een gebruiker logt in
* sessie wordt gestart
* indien de gebruiker ervoor kiest om ingelogd te blijven wordt er een cookie gezet ter verificatie van deze gebruiker.

* bij iedere hit moet je even controleren of die sessie bestaat
* als de sessie niet bestaat moet je kijken of er zo'n ik-wil-ingelogged-blijven cookie aanwezig is.
* als deze aanwezig is haal je de sessie data op uit een database oid. en de gebruiker is weer gewoon ingelogged, niets gemerkt.

overigens had je het over session destroy, dat is een beetje achterhaald. Je moet wel gebruik maken van $_SESSION vars en unset() om sessies ongedaan te maken.

Acties:
  • 0 Henk 'm!

  • mahi
  • Registratie: Juni 2001
  • Laatst online: 22-09-2020

mahi

God bless GoT

Topicstarter
Ik denk dat ik het probleem heb gevonden. Natuurlijk weer zo iets om van door de grond te zakken van schaamte :P

Het cookies idee is wel degelijk goed, maar je moet de cookies natuurlijk wel goed gebruiken. Ik gebruikte setcookie("remember_me", "1", 30 * 24 * 60 * 60) naar analogie van session_set_cookie_params(30 * 24 * 60 * 60). Maar... Ik was totaal uit het oog verloren dat setcookie en session_set_cookie_params de expiration tijd anders behandelen. Session_set_cookie_params vraagt een relatieve tijd in seconden startende vanaf de huidige tijd. Setcookie daarentegen vraagt een absolute tijd. Met andere woorden, vanzodra ik

setcookie("remember_me", "1", 30 * 24 * 60 * 60)

veranderde in

setcookie("remember_me", "1", time() + 30 * 24 * 60 * 60)

werkte het zootje schijnbaar. Ik heb het nog niet uitvoerig kunnen testen, maar het lijkt me vrij logisch dat dit de oplossing voor mijn probleem is. In het originele geval werd de cookie namelijk nooit gezet omdat het om een tijd in het verleden ging.

Martin.Duane: Ik gebruik wel degelijk de $_SESSION variabele en unset, maar session destroy typte sneller in m'n topic start :)

A bus station is where a bus stops. A train station is where a train stops... On my desk I have a workstation.

Pagina: 1