一,基础类
CUserIdentity:是一个基于用户名验证的身份和密码的基类
CWebUser:代表一个Web应用程序的持久状态
二,身份验证基本过程
一个典型的使用CWebUser的身份验证过程如下:
用户提供所需的信息进行身份验证。
一个是由用户提供的信息创建的身份标识实例。
调用IUserIdentity::authenticate来检查身份标识是否有效
如果有效,调用CWebUser::login登陆用户, 然后用户浏览器重定向到returnUrl。
如果无效,从身份标识中检索错误代码或错误信息 然后显示。
三,具体流程
1.使用CFormModel的子类接收并验证数据,若通过启动登陆流程(cotroller)
$model = new LoginForm; $model->attributes=$_POST[‘LoginForm‘]; if($model->validate() && $model->login()){ $this->redirect(Yii::app()->user->returnUrl); }
2.创建用户身份对象并进行登陆验证(LoginForm,UserIdentity)
/** * 使用给定的账号和密码登录 * @return boolean whether login is successful */ 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天 // CWebUser::login($identity,$duration=0);记录用户信息 Yii::app()->user->login($this->_identity,$duration); // 保存用户信息并设定过期时间 return true; }else{ return false; } }
public function authenticate(){ //演示用户 $users=array( // username => password ‘demo‘=>‘demo‘, ‘admin‘=>‘admin‘, ); $user_info = User::model()->findByAttributes(array(‘username‘=>$this->username)); if(empty($user_info)) //用户不存在 $this->errorCode=self::ERROR_USERNAME_INVALID; elseif($user_info[‘password‘]!==$this->password) //密码不正确 $this->errorCode=self::ERROR_PASSWORD_INVALID; else $this->errorCode=self::ERROR_NONE; return !$this->errorCode;
3 验证通过记录用户信息
// CWebUser::login($identity,$duration=0);记录用户信息 Yii::app()->user->login($this->_identity,$duration);
4 state的处理
identity中的state数据都是在调用CWebUser::login后存入了session
public function setState($key,$value,$defaultValue=null) { $key=$this->getStateKeyPrefix().$key; if($value===$defaultValue) unset($_SESSION[$key]); else $_SESSION[$key]=$value; } public function getState($key,$defaultValue=null) { $key=$this->getStateKeyPrefix().$key; return isset($_SESSION[$key]) ? $_SESSION[$key] : $defaultValue; }
4 销毁
CwebUser::logout
public function logout($destroySession=true) { if($this->beforeLogout()) { if($this->allowAutoLogin) { Yii::app()->getRequest()->getCookies()->remove($this->getStateKeyPrefix()); //清楚cookie if($this->identityCookie!==null) { $cookie=$this->createIdentityCookie($this->getStateKeyPrefix()); $cookie->value=null; $cookie->expire=0; Yii::app()->getRequest()->getCookies()->add($cookie->name,$cookie); } } if($destroySession) Yii::app()->getSession()->destroy(); //销毁会话 else $this->clearStates(); $this->_access=array(); $this->afterLogout(); } }
CHttpSession::destroy()
public function destroy() { if(session_id()!==‘‘) { @session_unset(); @session_destroy(); } }
原文:http://liyongjiang.blog.51cto.com/5800344/1358019