webForumDet fria alternativet

session och egen timeout funktion

6 svar · 320 visningar · startad av fredriksk

fredrikskMedlem sedan maj 2001211 inlägg
#1

Under kategorin "själv är bäste dräng" har jag nu stött på följande problem.

Håller på att utveckla ett administrationssystem och där ingår naturligtvis en inloggningsfunktion.

Ett önskemål från användare (och ledning) är att man efter en vis tid blir utloggad. Användaren skall själv få välja hur lång tid han får vara inloggad innan utloggning sker.

För ändamålet har jag byggt en funktion som heter check_login($page, $username, $password)

Som synes tar funktionen ett användarnamn och ett lösenord samt en sida = en funktion som användaren försöker nå....

Utan att bli för deltajerad utför funktionen att antal tester för att se huruvida användaren är behörig i systemet alls, behörig att se på sidan han frågar efter och om tiden är rätt...

Tiden är rätt beräknas på följande sätt:
När användaren loggar in i systemet hämtas en massa info om användaren. Dessa lagras i en array som kallas $user. Ett fält i arrayen heter ttl och anger hur länge personen önskar hållas inloggad innan utloggning sker. Till arrayen läggs vid inloggning ett fält till som heter timestamp och är av typen unixtimestamp.

alltså:

ttl = önskad inloggningstid (ex 28800 = 8 timmar)
timestamp = unix timestamp sätts till NU (nytt unixtimestamp) vid inloggning

Om en användare anropar check_login så kollas om NU > timestamp + ttl.

Om så är fallet loggas användaren ut direkt. Om inte så uppdateras $user['timestamp'] och allt börjar om....

Men nu är det så att användare i systemet blir utloggade efter, vad som ses som, men troligtvis inte är, godtycklig tid. Min misstanke var att det finns något annat som timar ut sessionen innan min funktion gör det.

Förmodligen är det detta: http://se.php.net/manual/en/ref.session.php

och då främst "session.gc_maxlifetime "1440""

Vilket passar min teori bra då 1440 = 24 minuter. Om någon då sätter värden högre än 24 min kommer PHP att kasta sessionen före min funktion timar ut den...

Men nu är det så att jag har testat att sätta 28800 = 8 timmar som värde på parametern i php.ini och därefter startat om apache men det har inte hjälpt....

Nu kommer jag säkert få mååånga käcka svar som visar hur jag på andra vis kan manipulera med dessa värden genom php kod men det är jag inte så intresserad av. Jag vill få min funktion att fungera då den är en så central del i ett, numera, mycket stort projekt (ca 350 filer stort...).

Så? Någon som har några bra idéer? Vad kan tima ut innan min funktion för det???

Redigering:

Tillägas bör att funktionen har testats på ett flertal inloggad personer med olika ttl satta till en hyfsat kort tid (5 - 15 min) och då fungerar funktionen mycket bra vilket talar för att den fungerar på det sättet den är tänkt och att det är något annat som strular till det...

nkrantzMedlem sedan apr. 2002830 inlägg
#2

http://se.php.net/manual/en/ref.session.php skrev:

session.gc_maxlifetime integer
session.gc_maxlifetime specifies the number of seconds after which data will be seen as 'garbage' and cleaned up.

Note: If you are using the default file-based session handler, your filesystem must keep track of access times (atime). Windows FAT does not so you will have to come up with another way to handle garbage collecting your session if you are stuck with a FAT filesystem or any other fs where atime tracking is not available. Since PHP 4.2.3 it has used mtime (modified date) instead of atime. So, you won't have problems with filesystems where atime tracking is not available.

Det verkar ju vara detta du skall använda. Har du testat att köra en ini_set istället för att ändra i php.ini?

// Nippe

fredrikskMedlem sedan maj 2001211 inlägg
#3

jupp... det är precis session.gc_maxlifetime integer jag har ändrat på. Det har som sagt inte hjälpt. Jag vill inte manipulera med den via ini_set. Helst vill jag bara ändra i php.ini och så är allt frid och fröjd...

För övrigt snurrar systemet på en Linuxweb och det går inte att ändra på.

Jag blir inte klok på det här... Fler förslag?

nkrantzMedlem sedan apr. 2002830 inlägg
#4

Okej, du vill inte ändra den via ini_set, men har du testat att göra det? Dessutom, om du skulle ändra den via ini_set så borde det ju vara enklare för dig att ändra så att sessionen timas ut efter utsatt tid.

// Nippe

fredrikskMedlem sedan maj 2001211 inlägg
#5

ok... testar med att sätta ini_set i en config fil som läses in en gång när användaren först loggar in....

No funkis... fortfarande timeout efter godtycklig tid...

nkrantzMedlem sedan apr. 2002830 inlägg
#6

Skumt... Det kanske är en bugg i php?!?

Dumma frågor bara för att göra dig säker på din sak: Är du säker på att du ändrar i rätt php.ini? När du körde php_ini funktionen så körs väl den bara under den aktiva sessionen, dvs, funktionen måste nog köras varje gång du hämtar en sida...

En annan sak, menar du att sessionen skulle pågå efter det att läsarfönstret är stängt? Använder du cookies i samband med sessionen eller kör du bara server-side?

// Nippe

fredrikskMedlem sedan maj 2001211 inlägg
#7

ok, nu har jag testat att köra den på varje sida men det blir ändå utloggning vid fel tid... Jag har ställt in min funktion att automatiskt logga ut efter 4 timmar (för testnings skull). Kommer jag tillbaka till burken efter ca 1,20 timmar så är jag redan utloggad...

Om användaren stänger ner sin webläsare så vill jag att sessionen skall försvinna och användaren skall därmed vara utloggad när han öppnar webläsaren igen. Dett fungerar precis som jag vill ha det...

Det ända jag vill är att användaren skall bli utloggad om denna inte har arbetat med systemet inom en viss tid... Användaren skall själv kunna bestämma hur lång inaktivitet som skall krävas för att bli utloggad..

227 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
144 ms — hämta tråd, inlägg och bilagor (db)