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 -->