PC Ekspert Forum

PC Ekspert Forum (https://forum.pcekspert.com/index.php)
-   Web dizajn, programiranje i ostalo (https://forum.pcekspert.com/forumdisplay.php?f=39)
-   -   PHP onemogućavanje istovremenog logiranja više korisnika sa istim username i pass (https://forum.pcekspert.com/showthread.php?t=78514)

beroland 29.08.2007. 17:44

PHP onemogućavanje istovremenog logiranja više korisnika sa istim username i pass
 
Imam potrebu za PHP skriptom s kojom je moguće onemogućiti istovremeno logiranje više korisnika sa istim usernameom i passwordom. Znači, ako Pero ima svaoj username i odgovarajući password i ako je to rekao svom frendu Juri, da se Jure ne može ulogirati s tim istim usernameom dok je god Pero logiran. Znači cilj je da i Jure napravi svoj account i da se onda sa svojim accauntom logira, a ne da koristi podatke od frenda. :-)

Tražio sam po netu i po hotscripts.com itd. i tko zna gdje sve nisam tražio odgovarajuću skriptu, ali nisam našao. Probao sam sa phpSecurePages ali nisam uspio. Znam da bi trebao konfigurirati sessione i povezanost njihovu sa MySQL-om, ali nisam toliko još dobar u php-u da bi to mogao sve sam programirati. Zna li netko kakvu gotovu skriptu koju mi može preporučiti ili ponuditi kakvu drugu pomoć? Jednostavnih rješenjea tipa tutorial (click, click i gotovo...) znam da nema za ovo pa ni ne pitam:D. tnx!

EDIT. Sory, zaboravio sam napomenuti.
poznati naš horza mi je ponudio pomoć u ovom projektu, ali kako je nismo realizirali kada smo o tome pričali prije ljeta, sada mi je malo nezgodno ga tlačiti kada su prošla 2-3 mjeseca. Ukoliko je i dalje zainteresiran, hvala, jedva čekam. Naravno i svi drugi su dobrodošli sa svojim pametnim savjetima i pomoći.

frANZi 29.08.2007. 17:48

Kad se Pero logira promijeniš mu status logiran (u tabeli korisnici, baza) u 1. Pri svakom loginu provjeravaš da li je taj user koji se logira već ulogiran (preko logiran statusa). Jel znaš to isprogramirati?

beroland 29.08.2007. 18:05

Respekt na brzini!
Hvala! Čini mi se da imaš dobru ideju. Sigurno bi svakako trebalo programirati i to da oznaka "1" ne traje dok god čovjek ne napravi logout već da ima vremnsko trajanje i da provjerava s cookisima svakih x minuta. Da se ne desi da se čovjeku sruši browser (ili ne daj bože komp:D) pa da se ne može više ulogirati.
To na žalost ne znam isprogramoirati.

frANZi 31.08.2007. 22:50

Da, moj algoritam ima taj (velik) nedostatak.

Ali sljedeći zato nema te se takav koristi u ovim i sličnim slučajevima.

U bazi imaš tabelu logirani sa poljima: korisnik_id INT | zadnja_izmjena INT
Ako je korisnik logiran, pri svakoj izmjeni stranice updateaš zadnja_izmjena s time(). To ćeš učiniti tako što na vrh svake stranice staviš funkciju koja to radi.

Kada dođe Jure i hoće se ulogirati, tvoj sistem provjerava da li u tabeli logirani postoji unos čiji je korisnik_id Perin (recimo da je njegov id 5, dakle provjeravaš da li postoji unos where korisnik_id=5), ali, moraš također provjeriti da li je vrijednost zadnja_izmjena viša od vrijednosti time() - razdoblje_neosvježavanja (kojeg ti sebi definiraš, to je najčešće 5 ili 10 minuta, dakle: 60*10). Ako su obadva uvjeta točna, znači da je Pero ulogiran, a ako je jedan od ta dva uvjeta netočan, znači da nije. Po tome dalje postupaš s Jurom.

Evo ti i query za to:
Citiraj:

Autor sql query
SELECT korisnik_id FROM logirani WHERE korisnik_id = $user* AND zadnja_izmjena > $time**

* pretpostavimo da ti u varijabli $user stoji id trenutno ulogiranog (inače stoji u $_SESSION['nesto'], ali eto)
** $time prije u php kodu definiraš: $time = time() - 60*10;
-> naravno, query ide bez zvjezdica


Ako dobiješ rezultat, Pero je ulogiran, ako ne - nije.

beroland 31.08.2007. 23:34

frANZi, legendo, fala na trudu i detaljnosti.

Tvoj algoritam nije imao nikakav (veliki) nedostatak već je bio dobra ideja. Ja sam napomenuo da bi vjerojatno trebalo dodati još neke stvari, jer sam o ovom problemu postao već prije i dosta razmišljao i tražio rješenje po netu. Nije to moje programersko znanje, već sam dosta toga dobio savjete od drugih, a i nešto sam i sam malo logički domislio:D.

Ovo što si sada napisao mi se logički čini vrlo odlično :-), jedino je stvar u tome što ja to ne znam pretvoriti u točan php code jer sam u php-u na početku. Čini mi se da ti barataš time vrlo dobro, a ja sam daleko od toga u kontekstu php-a.
Hvala!

Btw, u međuvremenu probao sam i trial skripte Omni-secure ali nisam uspio s njom ovo što bi meni trebalo. Mislim da nema te mogućnosti. Uf..

frANZi 01.09.2007. 01:18

Imaš li već napravljen sustav za login korisnika? Taj bi ti sustav u svakom slučaju trebao napraviti sesiju koja sadrži podatke o trenutno ulogiranom korisniku. Ja ću pretpostaviti da id trenutno ulogiranog korisnika držiš u $_SESSION['user'].

Ovo je funkcija koja updatea logirani tabelu:
-------------
function logiraniUpdate() {
if ($_SESSION['user']) { // tabela se updatea samo ako je posjetitelj ulogiran
$checkq = "SELECT korisnik_id FROM logirani WHERE korisnik_id = ".$_SESSION['user']; // provjera da li postoji zapis u bazi o ulogiranom posjetitelju
$check = mysql_query($checkq) or die(mysql_error());
if (mysql_num_rows($check) > 0) { // ako postoji...
$query = "UPDATE logirani SET zadnja_izmjena = '".time()."' WHERE korisnik_id = ".$_SESSION['user']; // ...napravi update
$result = mysql_query($query) or die(mysql_error());
} else { // a ako ne postoji...
$query = "INSERT INTO logirani VALUES ('".$_SESSION['user']."', '".time()."')"; // ...dodaj ga
$result = mysql_query($query) or die(mysql_error());
}
}
}
?>
-------------
Na vrhu svake stranice je pozoveš s logiraniUpdate;, s tim da funkciju moraš naravno includati (ako je staviš u odvojeni fajl).

Pri loginu ovako provjeravaš da li je korisnik u čiji se account trenutni posjetitelj logira već logiran (znači da li je Pero logiran a Jure je taj koji se hoće logirati u njegov account). Ovdje je vrlo bitno da imaš id ovoga koji se želi ulogirati. Dakle, prvo provjeriš da li je dobro ukucao username i password, ako je, uzmeš njegov id iz baze i spremiš ga u varijablu $privremeni_id (primjerice).
-------------
$time = time() - 60*10;
$query = "SELECT korisnik_id FROM logirani WHERE korisnik_id = '".$privremeni_id."' AND zadnja_izmjena > '".$time."'"; // ovo je onaj query iz prvog posta
$result = mysql_query($query) or die(mysql_error());
if (mysql_num_rows($result) > 0) { // ako postoji ulogiran već
exit; // prekini (prekidanje ne mora biti ovakvo)
} else { // ako ne postoji
$_SESSION['user'] = $privremeni_id; // ulogiraj ga
}
-------------

Kod je podložan sintaksnim pogreškama, nisam ga testirao. Možda će ga trebati još malo prilagoditi, ali to je u principu to.

Usput, uputio bih te na forum koji se bavi ovom tematikom: forum.webmajstori.net (valjda mi neće zamjeriti moderatori)

beroland 01.09.2007. 21:18

Franzi, hvala ti na pomoći.

Inače, sustav za login korisnika odabrao sam phpSecurePages . Za sada mi se čini vrlo dobar. radi mi u povezanosti s bazom i za sada je ok. Jedino bih htio njega sada nadograditi da mi funkcionira ovo što mi treba. Još nije to ništa objavljeno nego sve pokušavam prvo lokalno dobro iskonfigurirati i istestirati.

Mislim, rado bi ja i neko gotovo rješenje bez da moram phpSecurePages modificirati, ali ne uspijevam pronaći.:D

Ne znam kako da uspješno iskonfiguriram php da mi piše u bazu i stvara cookie koji bi mi trebali za to. Sad studiram ovaj tvoj kod što si mi pastao ovdje pa ću javit što sam uspio. Mnogo fala na kodu.

beroland 06.09.2007. 13:25

Uf, probao sam s ovime, ali očito ja nešto ne napravim dobro. Ne vidim nigdje u bazio da su unesene varijable korisnik_id i logirani. Valjda nisam dobro napravio bazu za ovo. Kako da ispravno konfiguriram ta polja. PhpSecurePages mi dobro funkcionira no ja sam statički unio podatke u polja koja njemu trebaju a on php escure radi PHPSESSION cookies. Ne uspijevam skužiti kako ovo ispravno uklopiti.

Inače, razmišljao sam o ovoj provjeri logina i onemogućavanju dvostrukog logina. Mislim da bi najbolje bilo kada bi noviji login izbacio onog vremenski straijeg i time bi rješio problem zatvaranja browsera bez logouta i problem da vremenski mora provjeravati skripta. Mislim da bi to moglo biti jednostavnije i efikasno. Šta kažete?


Sva vremena su GMT +2. Sada je 08:56.

Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 1999-2024 PC Ekspert - Sva prava pridržana ISSN 1334-2940
Ad Management by RedTyger