ユーザ認証
■Yiiのユーザ認証
Yiiのスケルトンアプリケーションにはすでにユーザ認証機能が備わっている。 デフォルトでは"demo"もしくは"admin"でログインが可能である。 今回のブログシステムのユーザ認証ではUserデータベーステーブル(tbl_user)に基いて 行うように対応するコードを修正する。 ユーザ認証は"IUserIdentity"インターフェースを実装するクラスで行われる。 このクラスファイルは『/blog/protected/components/UserIdentity.php』に保存されている。
■ユーザ認証の実装
“IUserIdentity”クラスを修正
場所:/protected/components/UserIdentity.php
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(!$user->validatePassword($this->password)) { // パスワードが間違っている $this->errorCode = self::ERROR_PASSWORD_INVALID; } else { // ログイン処理 $this->_id = $user->id; $this->username = $user->username; $this->errorCode = self::ERROR_NONE; } return $this->errorCode == self::ERROR_NONE; } /** * * ID取得 * **/ public function getId() { return $this->_id; } }
"authenticate()"メソッドにおいて、Userクラスを用いて、tbl_userテーブルの中から該当する"username"を探す。 "User"クラスは『gii』によって作られてて"CActiveRecord"を継承しているため、アクティブレコードの機能を 利用して"tbl_user"にアクセスすることができる。 UserIdentityクラスでは"getId()"メソッドをオーバーライドして、"tbl_user"テーブルから見つかったユーザーのIDを返す。 "username"と"id"プロパティは共にユーザセッションに保存されコードのどこからでも"Yii::app()->user"でアクセスすることが可能。
次に、ユーザが正当なパスワードを入力しているかをチェックする(validatePasswordメソッド)ため”User”クラスを修正
場所:/protected/models/User.php
/** * * パスワードチェック * **/ public function validatePassword($password) { return CPasswordHelper::verifyPassword($password, $this->password); } /** * * パスワードハッシュ化 * **/ public function hashPassword($password) { return CPasswordHelper::hashPassword($password); }
平文のパスワードをデータベースに保存するのではなくパスワードのハッシュを保存する。 ユーザが入力したパスワードを検証する際は【Yii】に組み込まれている"CPasswordHelper"クラスを利用する。 パスワードのハッシュの検証
修正後にhttp://loaclhost/blog/index.phpにアクセスして”tbl_user”テーブルに保存したユーザ名と
パスワードを入力してログインする。(デフォルトでは”demo/demo”)でログイン可能。
ただし現状では、ユーザ管理機能がない為、ユーザはウェブインターフェースを通じてアカウントを変更
したり、新しいアカウントを作成することが出来ない。
ログイン後の画面
参考サイト:
http://www.yiiframework.com/doc/blog/1.1/ja/prototype.auth