yii自动登录

时间:2024-01-05 18:43:14

在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方法,设置认证信息,在退出的时候也需要调用这个方法

  1. 设置session的有效期
  2. 如果cookie的有效期大于0并且允许自动登录,那么就把用户的认证信息保存到cookie中,调用sendIdentityCookie方法
  3. 如果允许自动登录,删除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信息