Klasa - autoryzacja 2007-01-02
Dzisiaj postanowiłem przedstawić prostą klasę wymuszającą logowanie, która chroni nasze zasoby.
Użycie jest bardzo proste co obrazuje poniższy przykład.
Kod klasy Authenticate:
Do ściągnięcia nowsza, ulepszona klasa, wraz z przykładami - wwwauthenticate.tgz.
PHP,
autoryzacja, dostęp, klasa, logowanie, artykuł, blog
Słowa kluczowe: PHP, autoryzacja, dostęp, klasa, logowanie, artykuł, blog
Nowy komentarz
Ciekawe, może potem sprawdzę :P
Powinno być chyba 'Unauthorized' ?
@void: tak, dzięki, już poprawiam
Wywala mi Taki blad..
>
Warning: Cannot modify header information - headers already sent by (output started at C:\WarfareServSite\www\authenticate.php:69) in C:\WarfareServSite\www\authenticate.php on line 61
Warning: Cannot modify header information - headers already sent by (output started at C:\WarfareServSite\www\authenticate.php:69) in C:\WarfareServSite\www\authenticate.php on line 62
Authorization Required.
jakies sugestie?
Czy umieściłeś skrypt na samym początku strony? Nie możesz najpierw wyświetlić np. <html>, a potem dać ten skrypt, skprypt musi być uruchamiany zanim cokolwiek zostanie wysłane do użytkownika.
a mi wywala biała strone...
Daj na początku skryptu :
ini_set('display_errors', 1);
ini_set('error_reporting', E_ALL);
To Ci wypisze błędy.
"Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or '}' in /apache/apache-common/virt/virtuals/virt-645341/katalog/auth.php on line 8"
Wymagane jest PHP5.
A ja wpisuje ten przykladowy login i password, i komp mieli mieli i wywala znow okienko logowania ;/ Mam zainstalowanego Apacha obsluga PHP 5 jest bo juz stronki robilem i wszystko dzialalo. Ogolnie to mam problemy z wszystkimi tego typu "autoryzacjami" bo bralem z innych stron i tak samo byl.... Takze to chyba nie problem kodu a cos u mnie :-) Bylbym wdzieczny za odpowiedz
A mi wszystko działa pięknie, ale mam pytanko:
Jak zrobić w PHP link z przyciskiem typu: Wyloguj
Z góry dzięki
Dopisałem metodę do wylogowania. Wystarczy zrobić prosty warunek:
if(isset($_GET['logout']) && $_GET['logout']) {
$oA->logout();
}
Dzięki za dopisanie wylogowania.
To jeszcze o jedną rzecz pozwole sobie zapytać.
Załużmy że mam stronę główną i chciałbym umieścić przycisk 'delete' tylko jeśli użytkownik jest zalogowany a jesli nie to nie chce mu pokazywać pola formularza do zalogowania tylko po prostu wyświetlić stronę dalej bez przycisku 'delete'.
Domyślam się, że trzeba by przerobić funkcję failed jakoś.
A może jest jakies prostsze rozwiązanie?
Dokonałem zmian. Zamiast check() używaj teraz login(). Natomiast do sprawdzania na stronie czy jest się zalogowanym użyj check().
if($oA->check()) { echo 'delete'; }
Nie no tak szybkiej odpowiedzi się nie spodziewałem. Dzięki.
Ja obszedłem problem na okolo dopisując dodatkową funckę która sprawdza w klasie czy jestes zalogowany i zwraca 0 lub 1, ale to tak na około.
Dzięki raz jeszcze, zaraz sprawdze Twoją wersję.
Funckcja check() działa pięknie.
Ale wracając do logowania jest jeszcze jeden problem.
Jak wywołujemy funkcję $oA->logout();
pojawia się okienko do wpisania hasła. Fakt jak sie wpisze złe to nastąpi wylogowanie, ale jak np dam canel to nic sie nie dzieje.
Moim skromnym zdaniem powinno być tak, ze na przykład klikasz link wyloguj i tyle, a nie ze wyskakuje Ci okienko do podania hasła i usera.
Nie rozum mnie źle, ja nie narzekam, klasa jest fajna, używam, piszę tylko uwagi coby usprawnić funcję.
@Tikky: podczas korzystania z PHP_AUTH_USER nie można wylogować się w inny sposób niż ten, który przedstawiłem. Żeby osiągnąć to co chcesz trzeba by to oprzeć na sesjach.
Umieściłem też trochę nowszą wersję klasy do ściągnięcia.
Mój sposobik na szyfrowanie hasła z użyciem tej klasy (sha1):
Dla strony:
$oA = new WWWAuthenticate(array('Nivo' => '3f6d191fdc202e6badd90839aa151116d7e710b7'));
Podajemy hasło zahashowane (pobrane np. z bazy).
Do check(); dodajemy na wstępie:
$ile = strlen($_SERVER['PHP_AUTH_PW']);
if($ile < 40) {
$_SERVER['PHP_AUTH_PW'] = sha1($_SERVER['PHP_AUTH_PW']);
}
W ten sposób nasze hasło przenoszone przez zmienną $_SERVER['PHP_AUTH_PW'] jest szyfrowane, więc jest nieco bezpieczniej. Warunkiem jest, aby pierwotne hasło użytkownika nie było dłuższe niż 39 znaków.
Dzięki stormfly za świetną klasę.