Forumi


Povratak   PC Ekspert Forum > Računala > Software > Web dizajn, programiranje i ostalo
Ime
Lozinka

Odgovori
 
Uređivanje
Staro 29.08.2007., 17:44   #1
beroland
to te ja pitam
Moj komp
 
beroland's Avatar
 
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.
beroland je offline   Reply With Quote
Staro 29.08.2007., 17:48   #2
frANZi
Dr. Gonzo
Moj komp
 
frANZi's Avatar
 
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?
frANZi je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Staro 29.08.2007., 18:05   #3
beroland
to te ja pitam
Moj komp
 
beroland's Avatar
 
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



beroland je offline   Reply With Quote
Staro 31.08.2007., 22:50   #4
frANZi
Dr. Gonzo
Moj komp
 
frANZi's Avatar
 
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:
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.
frANZi je offline   Reply With Quote
Staro 31.08.2007., 23:34   #5
beroland
to te ja pitam
Moj komp
 
beroland's Avatar
 
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



beroland je offline   Reply With Quote
Staro 01.09.2007., 01:18   #6
frANZi
Dr. Gonzo
Moj komp
 
frANZi's Avatar
 
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)
frANZi je offline   Reply With Quote
Staro 01.09.2007., 21:18   #7
beroland
to te ja pitam
Moj komp
 
beroland's Avatar
 
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



beroland je offline   Reply With Quote
Staro 06.09.2007., 13:25   #8
beroland
to te ja pitam
Moj komp
 
beroland's Avatar
 
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



beroland je offline   Reply With Quote
Oglasni prostor
Oglas
 
Oglas
Odgovori



Pravila postanja
Vi ne možete otvarati nove teme
Vi ne možete pisati odgovore
Vi ne možete uploadati priloge
Vi ne možete uređivati svoje poruke

BB code je Uključeno
Smajlići su Uključeno
[IMG] kod je Uključeno
HTML je Isključeno

Idi na