ユーザ認証
■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
