Napisał: Dawid Pacholczyk
O logowaniu słów kilka
Czy nie zastanawiało Was nigdy w jaki sposób zalogować użytkownika ? Zrobić autologowanie ? Otóż spotkałem się ostatnio z dość nietypową sytuacją. Musiałem zalogować użytkownika w momencie jego rejestracji, a więc kilka słów o tym.
O bezpieczeństwie słów kilka
Na wstępie zacznę od tego dlaczego nie powinno się tego robić. Aktualnie ponad 60% maili w sieci to spam, do tego niezliczona ilość botów i robotów, które stają się coraz wymyślniejsze i potrafią obchodzić coraz to bardziej wyrafinowane zabezpieczenia. Tu właśnie zaczynają się schody. Załóżmy, że strona posiada 1000 rejestracji dziennie z czego 10% to boty. Daje nam to 100 zalogowanych pseudoużytkowników. Wygląda kiepsko. Dlatego – moim zdaniem – element taki możemy zastosować tylko wtedy, gdy mamy 100% pewności, że boty nie mają tam wstępu: przykładem może być intranet lub rejestracja wymagająca weryfikacji.
Działanie
Samo działanie takiego autologowania jest stosunkowo proste. Musimy posłużyć się gotowcem:
$loginData=array(
'uname' => 'johndoe', // login
'uident'=> 'mypassword', // hasło
'status' => 'login'
);
$GLOBALS['TSFE']->fe_user-checkPid=0; // nie ustawiamy konkretnego pid
$info= $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
$user=$GLOBALS['TSFE']->fe_user->fetchUserRecord(
$info['db_user'],$loginData['uname']);
$ok=$GLOBALS['TSFE']->fe_user->compareUident($user,$loginData);
if($ok) {
// poprawne zalogowanie
$GLOBALS['TSFE']->fe_user->createUserSession($user);
} else {
// obsługa błędnego logowania
$this->error();
}
To sztampowy kawałek kodu. Teraz zróbmy z niego użytek:
$postvars = $GLOBALS[‘_POST’];
$loginData=array(
'uname' => $postvars[‘userlogin’], // login
'uident'=> $postvars[‘password’], // hasło
'status' => 'login'
);
Niby tak nie wiele, a jednak. Już w ten prosty sposób możemy przechwycić dane i zalogować użytkownika. Oczywiście ten fragment kodu musi po procesie rejestracji. Jeżeli damy go przed to dane pobrane z post`a nigdy nie będę sprawdzone poprawnie bo w rzeczywistości takiego użytkownika jeszcze nie będzie w bazie.
Ciekawostka
Do samego procesu zalogowania możemy posłużyć się wbudowanym mechanizmem TYPO3 i po prostu wygenerować odpowiedni link:
http://www.przyklad.com/index.php?id=1&logintype=login&user={login}&pass={password}&pid={pid}
co tu widzimy:
è id=1 – id strony
è logintype=login – typ procesu. W tym wypadku zalogowanie
è user={login} – nazwa użytkownika
è pass={password} – przypisane mu hasło
è pid={pid} – id strony zawierającej dane o użytkownikach
Jak tego użyć ? W bardzo prosty sposób
$postvars = $GLOBALS[‘_POST’];
$user = $postvars[‘user’];
$password = $postvars[‘password’];
$this->register() // proces rejestracji
Header(„Location: http://www.przyklad.com/index.php?id=1&logintype=login&user=$login&pass=$password”);
W ten prosty sposób pobierzmy dane z posta, zarejestrujemy użytkownika przekserujemy go gdzie chcemy i go zalogujemy.
Uwagi
Na koniec chciałbym zaznaczyć, że wszystkie mechanizmy tu opisane możemy bez problemów wykorzystać do własnego rozszerzenia logującego użytkownika. Jednak chciałem pokazać bardziej kompleksowy przykład.
