yiiのアクセス制御を学ぶ ログインの巻

YiiFrameworkのアクセスコントロールを学習したときのメモ。
ログインから始めロールベースアクセスコントロール、YiiRightsに辿り着きたい。素直にcookbook買うべきなのかもしれない。

ログイン

ユーザー認証。これがなくちゃ話にならない。最初に注意すべきなのは

情報: identity クラスと user アプリケーションコンポーネントはしばしば混同されます。前者は認証を行う方法のことであり、後者は現在のユーザに関する情報をあらわします。

http://www.yiiframework.com/doc/blog/1.1/ja/prototype.auth

というところか。

identity クラスとはCUserIdentityのこと。user アプリケーションコンポーネントとは CWebUserのこと。そして config/main.php の user ってのは、CWebUser のこと。
protected/config/main.php

<?php
	'components'=>array(
		'user'=>array(
			// enable cookie-based authentication
			'allowAutoLogin'=>true,
		),
	),

userはアプリケーションでひとつだけだが、identity:認証方法は複数持てる。

認証の流れはガイド/チュートリアル/Blogデモ実装されているから迷わない。。。と思ったら迷った。SiteController#actionLogin -> LoginForm#login -> UserIdentity#authenticate, CWebuser#login と辿るうちに login の多さにめまいがする。Yii::app()->user->login() している protected/models/LoginForm.php を軸に辿れば迷わない。

protected/models/LoginForm.php

<?php
	public function login()
	{
		if($this->_identity===null)
		{
			$this->_identity=new UserIdentity($this->username,$this->password);   // 認証情報を「認証方法」に渡す
			$this->_identity->authenticate();                                     // 認証
		}
		if($this->_identity->errorCode===UserIdentity::ERROR_NONE)                    // 結果を判断
		{
			$duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days
			Yii::app()->user->login($this->_identity,$duration);                  // 「認証方法」からユーザー情報を引き渡す
			return true;
		}
		else
			return false;
	}

CUserIdentity を介してuser.id, user.name を CWebUser.login に引き渡していることが理解できればOKだと思う。

ログアウト

CWebUserのLogoutメソッドをコールする。これはコントローラに実装されている。
protected/controllers/SiteController.php

<?php
	public function actionLogout()
	{
		Yii::app()->user->logout();
		$this->redirect(Yii::app()->homeUrl);
	}

ログイン済/未ログインの判断

次のコードで判断できる

<?php
if (Yii::app()->user->isGuest) {
	echo '未ログイン:'.Yii::app()->user->name;
} else {
	echo 'ログイン済:'.Yii::app()->user->name;
}

この判断は layouts/main.php などで見られる。
protected/views/layouts/main.php

    <div id="mainmenu">
        <?php $this->widget('zii.widgets.CMenu',array(
            'items'=>array(
                array('label'=>'Home', 'url'=>array('post/index')),
                array('label'=>'About', 'url'=>array('site/page', 'view'=>'about')),
                array('label'=>'Contact', 'url'=>array('site/contact')),
                array('label'=>'Login', 'url'=>array('site/login'), 'visible'=>Yii::app()->user->isGuest),
                array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('site/logout'), 'visible'=>!Yii::app()->user->isGuest)
            ),
        )); ?>
    </div><!-- mainmenu -->