在yii,登录页面选择记住密码,下次就会自动登陆
前些天,自己增加了一个web应用,但是发现虽然选择记住密码,没选退出,关闭浏览器,重新进入还会跳转到登陆页面
自动登录是利用cookie实现的
配置User组件
首先在配置文件的components中设置user组件
'user' => [
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
'idParam' => '__check',
'identityCookie'=> ['name'=>'_check','httpOnly' => true], ],
登陆
vendor\yiisoft\yii2\web\User.php的login中
$this->switchIdentity($identity, $duration);
先登录在调用switchIdentity方法,设置认证信息,在退出的时候也需要调用这个方法
- 设置session的有效期
- 如果cookie的有效期大于0并且允许自动登录,那么就把用户的认证信息保存到cookie中,调用sendIdentityCookie方法
- 如果允许自动登录,删除cookie信息。这个是用于退出的时候调用的。退出的时候传递进来的$identity为null
sendIdentityCookie
存储在cookie中的用户信息包含有三个值:
- $identity->getId()
- $identity->getAuthKey()
- $duration
getId()和getAuthKey()是在IdentityInterface接口中的。在设置User组件的时候,这个User Model是必须要实现IdentityInterface接口的。所以,可以在User Model中得到
第三值就是cookie的有效期
自动从cookie登录
用户的认证信息已经存储到cookie中了,下次直接从cookie里面取信息然后设置就可以了
Yii提供了AccessControl来判断用户是否登录,有了这个就不需要在每一个action里面再判断了
public function behaviors()
{
return [
'access' => [
'class' => AccessControl::className(),
'only' => ['logout'],
'rules' => [
[
'actions' => ['logout'],
'allow' => true,
'roles' => ['@'],
],
],
],
];
}
在AccessControl访问控制里面通过IsGuest属性来判断是否是认证用户,然后在getIsGuest方法里面是调用getIdentity来获取用户信息,如果为空就是游客(未登录),否则是认证用户。
是认证用户,调用renewAuthStatus(),重新生成用户认证信息
renewAuthStatus()先通过session来判断用户,因为用户登录后就已经存在于session中了。然后再判断如果是自动登录,那么就通过 loginByCookie()方法用cookie信息来登录。
loginByCookie()先读取cookie值,然后$data = json_decode($value, true);反序列化为数组。
要想实现自动登录,这三个值都必须有值。在User Model中还必须要实现findIdentity、validateAuthKey这两个方法。
退出
logout()
$this->switchIdentity(null);先把当前的认证设置为null
再判断如果是自动登录功能则再删除相关的cookie信息