本篇文章是對在yii中新增一個用戶驗證的方法進行了詳細的分析介紹,需要的朋友參考下
1.為什麼要新增一個用戶驗證:
因為我要將網站後台和前台做在同一個yii的應用中.但是前台也包含有會員的管理中心.而這兩個用戶驗證是完全不同的,所以需要兩個不同登陸頁面,要將使用者資訊保存在不同的cookie或session中.所以需要在一個應用程式中增加一個使用者驗證
2.yii的使用者驗證:
在自訂使用者驗證前,我們首先要弄清楚yii的驗證和授權方式.
為了驗證一個使用者,我們需要定義一個有驗證邏輯的驗證類別.在yii中這個類別需要實現IUserIdentity介面,不同的類別就可以實現不同的驗證方法.網站登陸一般需要驗證的就是使用者名稱和密碼,yii提供了CUserIdentity類別,這個類別一般用於驗證使用者名稱和密碼的類別.繼承後我們需要重寫其中的authenticate()方法來實作我們自己的驗證方法.具體程式碼如下:
Php程式碼
class UserIdentity extends CUserIdentity { private $_id; public function authenticate() { $record=User::model()->findByAttributes(array('username'=>$this->username)); if($record===null) $this->errorCode=self::ERROR_USERNAME_INVALID; else if($record->password!==md5($this->password)) $this->errorCode=self::ERROR_PASSWORD_INVALID; else { $this->_id=$record->id; $this->setState('title', $record->title); $this->errorCode=self::ERROR_NONE; } return !$this->errorCode; } public function getId() { return $this->_id; } }
在使用者登陸時則呼叫如下程式碼:
Php程式碼
// 使用提供的用户名和密码登录用户 $identity=new UserIdentity($username,$password); if($identity->authenticate()) Yii::app()->user->login($identity); else echo $identity->errorMessage;
使用者退出時,則呼叫以下程式碼:
Php程式碼
// 注销当前用户 Yii::app()->user->logout(); 其中的user是yii的一个components.需要在protected/config/main.php中定义
Php程式碼
'user'=>array( // enable cookie-based authentication 'allowAutoLogin'=>true, 'loginUrl' => array('site/login'), ),
這裡我們沒有指定user的類別名稱.因為在yii中預設user為CWebUser類別的實例.
我們現在已經實現了用戶的登陸驗證和退出.但是現在無論是否登陸,用戶都能存取所有的action,所以下一步我們要對使用者存取進行授權.在yii裡是透過Access Control Filter即存取控制過濾器來實現使用者授權的.我們看一下一個簡單的帶有存取控制的Controller:
Php程式碼
class AdminDefaultController extends CController { public function filters() { return array('accessControl'); } public function accessRules() { return array( array( 'allow', 'users' => array('@'), ), array( 'deny', 'users' => array('*') ), ); } }
我們在filters方法中設定具體的filter.我們可以看到在filters方法回傳的array裡有accessControl參數,在CController類別中有一個filterAccessControl方法:
Php程式碼
public function filterAccessControl($filterChain) { $filter=new CAccessControlFilter; $filter->setRules($this->accessRules()); $filter->filter($filterChain); }
在裡面新建了一個CAccessControlFilter實例,並且在setRules時傳入了accessRules()方法傳回的參數.
$filter->filter($filterChain)則是繼續呼叫其它filter.
而所有具體的授權規則則是定義在accessRules中:
Php代碼
public function accessRules() { return array( array('deny', 'actions'=>array('create', 'edit'), 'users'=>array('?'), ), array('allow', 'actions'=>array('delete'), 'roles'=>array('admin'), ), array('deny', 'actions'=>array('delete'), 'users'=>array('*'), ), ); }
具體規則參見yii的手冊.
3.新增一個驗證體系:
#首先我們從CWebUser繼承一個CAdminUser:
Php程式碼
class CAdminWebUser extends CWebUser { public $loginUrl = array('admin/admin/login'); }
我們需要把他放置到components中
如果是全域應用程式則透過protected/config/main.php的components小節:
Php程式碼
'user'=>array( // enable cookie-based authentication 'class' => 'CAdminUser', 'allowAutoLogin'=>true, 'loginUrl' => array('site/login'), ),
#如果是在modules中則在模組類別的init方法中加入如下程式碼:
Php程式碼
$this->setComponents(array( 'adminUser' => array( 'class' => 'CAdminWebUser', 'allowAutoLogin' => false, ) ));
最後呼叫方式
Php程式碼
//全局应用 Yii::app()->getComponent('adminUser'); //在模块中 Yii::app()->controller->module->getComponent('adminUser');
但僅僅這樣還不夠,我們還需要修改Controller的filter,我們需要自訂一個filter,來實現另一個用戶的驗證和授權
第一步自訂一個filter:
Php程式碼
class CAdminAccessControlFilter extends CAccessControlFilter { protected function preFilter($filterChain) { $app=Yii::app(); $request=$app->getRequest(); $user = Yii::app()->controller->module->getComponent('adminUser'); $verb=$request->getRequestType(); $ip=$request->getUserHostAddress(); foreach($this->getRules() as $rule) { if(($allow=$rule->isUserAllowed($user,$filterChain->controller,$filterChain->action,$ip,$verb))>0) // allowed break; else if($allow<0) // denied { $this->accessDenied($user); return false; } } return true; } }
再重寫CController類別的filterAccessController方法
Php程式碼
public function filterAccessControl($filterChain) { $filter = new CAdminAccessControlFilter(); $filter->setRules($this->accessRules()); $filter->filter($filterChain); } //在这里我们使用自定义的filter类替换了原来的filter
OK,到這裡我們就可以在此Controller的accessRules()中指定adminUser的授權了
以上就是本文的全部內容,希望對大家的學習有所幫助,更多相關內容請關注PHP中文網!
相關推薦:
如何實作修改yii2.0用戶登入所使用的user表為其它的表
#
以上是如何在yii中新增一個使用者驗證的詳細內容。更多資訊請關注PHP中文網其他相關文章!