|
29.08.2007., 17:44 | #1 |
to te ja pitam
Datum registracije: Dec 2006
Lokacija: Rijeka
Postovi: 572
|
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. 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.
__________________
1: Intel Badaxe2 () C2Q Q6600 () 2x2GB Kingmax 800MHz () Gigabyte GF 7300GT () 2 x Seagate 7200.10 320GB SATA II () Corsair VX 550W () DVD±RW LG H22 () Rebel 12 Economy 2: Gigabyte GA-965GM-S2 () C2D E6400 () 2x1GB Kingmax 667MHz () Seasonic S12 380W Zadnje izmijenjeno od: beroland. 29.08.2007. u 18:00. |
29.08.2007., 17:48 | #2 |
Dr. Gonzo
Datum registracije: Dec 2005
Lokacija: Zagreb
Postovi: 958
|
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? |
|
|
Oglas
|
|
29.08.2007., 18:05 | #3 |
to te ja pitam
Datum registracije: Dec 2006
Lokacija: Rijeka
Postovi: 572
|
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) pa da se ne može više ulogirati. To na žalost ne znam isprogramoirati.
__________________
1: Intel Badaxe2 () C2Q Q6600 () 2x2GB Kingmax 800MHz () Gigabyte GF 7300GT () 2 x Seagate 7200.10 320GB SATA II () Corsair VX 550W () DVD±RW LG H22 () Rebel 12 Economy 2: Gigabyte GA-965GM-S2 () C2D E6400 () 2x1GB Kingmax 667MHz () Seasonic S12 380W |
31.08.2007., 22:50 | #4 | |
Dr. Gonzo
Datum registracije: Dec 2005
Lokacija: Zagreb
Postovi: 958
|
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:
** $time prije u php kodu definiraš: $time = time() - 60*10; -> naravno, query ide bez zvjezdica Ako dobiješ rezultat, Pero je ulogiran, ako ne - nije. |
|
31.08.2007., 23:34 | #5 |
to te ja pitam
Datum registracije: Dec 2006
Lokacija: Rijeka
Postovi: 572
|
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. 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..
__________________
1: Intel Badaxe2 () C2Q Q6600 () 2x2GB Kingmax 800MHz () Gigabyte GF 7300GT () 2 x Seagate 7200.10 320GB SATA II () Corsair VX 550W () DVD±RW LG H22 () Rebel 12 Economy 2: Gigabyte GA-965GM-S2 () C2D E6400 () 2x1GB Kingmax 667MHz () Seasonic S12 380W |
01.09.2007., 01:18 | #6 |
Dr. Gonzo
Datum registracije: Dec 2005
Lokacija: Zagreb
Postovi: 958
|
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: ------------- <?php 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) |
01.09.2007., 21:18 | #7 |
to te ja pitam
Datum registracije: Dec 2006
Lokacija: Rijeka
Postovi: 572
|
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. 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.
__________________
1: Intel Badaxe2 () C2Q Q6600 () 2x2GB Kingmax 800MHz () Gigabyte GF 7300GT () 2 x Seagate 7200.10 320GB SATA II () Corsair VX 550W () DVD±RW LG H22 () Rebel 12 Economy 2: Gigabyte GA-965GM-S2 () C2D E6400 () 2x1GB Kingmax 667MHz () Seasonic S12 380W |
06.09.2007., 13:25 | #8 |
to te ja pitam
Datum registracije: Dec 2006
Lokacija: Rijeka
Postovi: 572
|
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?
__________________
1: Intel Badaxe2 () C2Q Q6600 () 2x2GB Kingmax 800MHz () Gigabyte GF 7300GT () 2 x Seagate 7200.10 320GB SATA II () Corsair VX 550W () DVD±RW LG H22 () Rebel 12 Economy 2: Gigabyte GA-965GM-S2 () C2D E6400 () 2x1GB Kingmax 667MHz () Seasonic S12 380W |
|
|
Oglas
|
|
|
|