Nasza aplikacja blogu potrzebuje umieć rozróżnić użytkownika systemy od gościa. Dlatego też, potrzebujemy zaimplementować funkcjonalność uwierzytelniania użytkowników.
Jak zapewnie się zorientowałeś szkielet aplikacji dostarcza już uwierzytelnienia użytkownika
poprzez sprawdzanie czy nazwa użytkownika i pasmo to jednocześnie demo
lub admin
.
W części tej zmodyfikujemy odpowiadający temu kod, tak aby uweerzytelnienie odbywało się
w oparciu o bazę danych User
.
Uwierzytelnienie użytkownika wykonywane jest w klasie implementującej interfejs IUserIdentity.
Szkielet aplikacji używa do tego celu klasy UserIdentity
. Klasa ta znajduje się
w pliku /wwwroot/blog/protected/components/UserIdentity.php
.
Wskazówka: Dla wygody, nazwa pliku klasy musi być taka sama jak odpowiadają mu nazwa klasy i zakończona rozszerzeniem
.php
. Używając tej konwencji, można
odnosić się do klasy używając aliasów ścieżek. Na przykład, możemy odnosić się do klasyUserIdentity
przy użyciu aliasuapplication.components.UserIdentity
. Wiele API w Yii jest w stanie rozpoznawać
aliasy ścieżek (np. Yii::createComponent()), dodatkowo używanie aliasów, pozwala uniknąć konieczności umieszczania absolutnych ścieżek do plików w kodzie. Występowanie tych ostatnich często powoduje problemy podczas wdrażania aplikacji.
Zmodyfikujemy klasę UserIdentity
w następujący sposób:
class UserIdentity extends CUserIdentity { private $_id; public function authenticate() { $username=strtolower($this->username); $user=User::model()->find('LOWER(username)=?',array($username)); if($user===null) $this->errorCode=self::ERROR_USERNAME_INVALID; else if(md5($this->password)!==$user->password) $this->errorCode=self::ERROR_PASSWORD_INVALID; else { $this->_id=$user->id; $this->username=$user->username; $this->errorCode=self::ERROR_NONE; } return !$this->errorCode; } public function getId() { return $this->_id; } }
W metodzie authenticate(), używamy klasy
Userdo wyszukiwania wiersza danych w tabeli
User, którego kolumna
usernameposiada tą samą wartość co nazwa użytkownika, bez uwzględnienia
wielkości liter. Przypominamy, że klasa
Userzostała utworzona za pomocą narzędzia
yiicw poprzedniej części. Ponieważ klasa
Userdziedziczy z [CActiveRecord],
możemy wykorzystać [funkcjonalność rekordu aktywnego](http://www.yiiframework.com/doc/guide/database.ar)
i uzyskać dostęp do tabeli
User` w obiektowy (OOP) sposób.
W klasie UserIdentity
nadpisujemy również metodę getId()
, która zwraca wartość id
dla znalezionego w tabeli User
użytkownika. Poprzednia implementacja zwracała nazwę użytkownika (username).
Obie właściwości: nazwa użytkownika username
oraz jego ID id
będą zachowane w sesji użytkownika user
oraz będzie można do nich uzyskać dostęp poprzez Yii::app()->user
z dowolnego miejsca w naszym kodzie.
Wskazówka: W klasie
UserIdentity
odnosimy się do klasy CUserIdentity bez
bezpośredniego włączania odpowiadającego jej pliku klasy. Dzieje się tak, gdyż klasa CUserIdentity jest rdzenną klasą dostarczaną przez framework Yii. Yii automatycznie załączy plik klasy dla każdej z rdzennych klas, podczas pierwszego odniesienia się do niej. Dokładnie to samo zrobimy z klasąUser
. Dzieje się tak
ponieważ plik klasyUser
znajduje się w katalogu/wwwroot/blog/protected/models
,
który został dodany doinclude_path
PH zgodnie z następującymi liniami znajdującymi się w konfiguracji aplikacji:
>
return array( ...... 'import'=>array( 'application.models.*', 'application.components.*', ), ...... );
Powyższa konfiguracja mówi, iż każda z klasy, której plik klasy znajduje się w katalogu
/wwwroot/blog/protected/models
lub też/wwwroot/blog/protected/components
będzie automatycznie załączony jeśli odnosimy się do klasy po raz pierwszy.
Klasa UserIdentity
jest używana przede wszystkim w klasie LoginForm
w celu uwierzytelnienia użytkownika bazującego na wprowadzonej na stronie logowania
nazwie użytkownika i haśle. Następujący fragment kodu pokazuje w jaki sposób
klasa UserIdentity
jest używana:
$identity=new UserIdentity($username,$password);
$identity->authenticate();
switch($identity->errorCode)
{
case UserIdentity::ERROR_NONE:
Yii::app()->user->login($identity);
break;
......
}
Info: Ludzie często mylą tożsamość (UserIdentity) i komponent użytkownika aplikacji
user
. Pierwsze (tożsamość) reprezentuje sposób przeprowadzania uwierzytelnienia, druga zaś używana jest do reprezentowania informacji związanych z aktualnym użytkownikiem. Aplikacja może posiadać tylko jeden komponent użytkownikauser
, ale może posiadać
jedną lub więcej klas tożsamościowych w zależności od rodzaju wpieranego sposobu uwierzytelniania. Po uwierzytelnieniu, instancja zawierająca tożsamość może przekazać swoje informacje o stanie do komponentu użytkownikauser
, tak, że ten jest globalnie dostępne poprzez właściwośćuser
.
W celu przetestowania zmodyfikowanej klasy UserIdentity
, możemy otworzyć adres URL
http://www.example.com/blog/index.php
i spróbować zalogować się przy użyciu nazwy użytkownika
oraz hasła przechowywanego w tabeli User
. Jeśli użyjemy bazy danej dostarczonej przez
mego blogu, powinniśmy być w stanie zalogować się
przy użyciu nazwy użytkownika demo
oraz hasła demo
. Zauważ, że ten system blogowy nie
dostarcza funkcjonalności zarządania użytkownikami. W rezultacie użytkownik nie może zmienić
swojego konta czy też stworzyć nowe poprzez interfejs sieciowy. Funkcjonalność zarządzania użytkownikami
może zostać rozważona jako przyszłe rozszerzenie dla naszej aplikacji.
Signup or Login in order to comment.