Yii验证
Yii auth framework 的核心一块是一个事先声明的user application component(用户应用部件),实现IWebUser接口的对象。此用户部件代表当前用户存储的身份信息。我们能够通过 Yii::app()->user在任何地方来获取它。
使用此用户部件,可以通过CWebUser::isGuest检查一个用户是否登陆。可以login (登陆)或者logout (注销)一个用户;可以通过CWebUser::checkAccess检查此用户是否能够执行特定的操作;还可以获得此用户的unique identifier(唯一标识)和别的身份信息。
定义身份类(Defining Identity Class)
为了验证一个用户,我们定义一个有验证逻辑的身份类。这个身份类实现IUserIdentity 接口。不同的类可能实现不同的验证方式(例如:OpenID,LDAP)。最好是继承 CUserIdentity,此类是居于用户名和密码的验证方式。
定义身份类的主要工作是实现IUserIdentity::authenticate方法。在用户会话中根据需要,身份类可能需要定义别的身份信息
下面的例子,我们使用Active Record来验证提供的用户名、密码和数据库的用户表是否吻合。我们通过重写getId函数来返回验证过程中获得的_id变量(缺省的实现则是返回用户 名)。在验证过程中,我们还借助CBaseUserIdentity::setState函数把获得的title信息存成一个状态。
classUserIdentity extends CUserIdentity
{
private $_id;
public function authenticate()
{
$record=User::model()->findByAttributes(array('username'=>$this->username));
if($record===null)
$this->errorCode=self::ERROR_USERNAME_INVALID;
elseif($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;
}
}
作为状态存储的信息(通过调用CBaseUserIdentity::setState)将被传递给CWebUser。而后者则把这些信息存放在一 个永久存储媒介上(如session)。我们可以把这些信息当作CWebUser的属性来使用。例如,为了获得当前用户的title信息,我们可以使用 Yii::app()->user->title(这项功能是在1.0.3版本引入的。在之前的版本里,我们需要使用 Yii::app()->user->getState('title'))。
提示: 缺省情况下,CWebUser用session来存储用户身份信息。如果允许基于cookie方式登录(通过设置 CWebUser::allowAutoLogin为 true),用户身份信息将被存放在cookie中。确记敏感信息不要存放(例如 password) 。
登录和注销(Login and Logout)
使用身份类和用户部件,我们方便的实现登录和注销。
// 使用提供的用户名和密码登录用户$identity=newUserIdentity($username,$password); if($identity->authenticate())Yii::app()->user->login($identity); elseecho$identity->errorMessage; ...... // 注销当前用户Yii::app()->user->logout();
缺省情况下,用户将根据session configuration完成一序列inactivity动作后注销。设置用户部件的allowAutoLogin属性为true和在 CWebUser::login方法中设置一个持续时间参数来改变这个行为。即使用户关闭浏览器,此用户将保留用户登陆状态时间为被设置的持续时间之久。 前提是用户的浏览器接受cookies。
// 保留用户登陆状态时间7天// 确保用户部件的allowAutoLogin被设置为true。Yii::app()->user->login($identity,3600*24*7);
364

被折叠的 条评论
为什么被折叠?



