Yii2 cookie自动登陆和自动退出 [ 2.0 版本 ]
最近学习yii2利用cookie自动登陆,发现网上的文章都只提到了自动登陆,并没有涉及自动退出的实现,那么,登陆时设置的过期时间有什么作用呢?笔者通过分析源码,通过重载user组件的getIsGeuest()方法,实现了cookie登陆状态的自动退出功能,如有不当,请高手指正,以免贻误他人。(yii2利用session实现自动登陆与自动退出的文章网上很多,yii2的实现也堪称完美,不再赘述)
一、自动退出的实现原理
yii2中判断用户的登陆状态,是通过检测Yii::$app->user->isGuest实现的,实际是调用了yii\web\user\getIsGuest(),在cookie登陆时,如果满足以下条件,就会往cookie中写入identity信息:
- 配置了identityClass并且实现identityInterface接口
- user组件配置'enableAutoLogin' => true
- 调用Yii::$app->user->login($user,$duration)注册登陆信息时,$user应该是identityClass的一个实例,$duration大于零(身份信息的过期时间)。
写入cookie中的identity信息过期后会自动消失,而基于ACF的访问控制是通过检测Yii::$app->user->isGuest判断用户的登陆状态的,所以只需在yii\web\user\getIsGuest()中增加检测,看cookie中是否还存在用户的身份信息,如果没有了,返回true,表示当前用户是一个游客,即可实现自动退出登陆的功能。
但是,登陆过程不能通过cookie判断是否游客(使用源码的流程处理),因为登陆时写入cookie的身份信息还没有发送到客户端,是读取不到的。
当然,源码是不宜直接修改的,笔者采用重写user并继承自yii\web\user,在其中重载getIsGuest()
二、实现过程和代码如下
- user组件中增加配置'class' => 'app\components\MyUser',指向重写的MyUser组件。
'user' => [
'class' => 'app\components\MyUser',
'identityClass' => 'app\models\User',
'enableAutoLogin' => true,
'identityCookie' => ['name' => '_identity1', 'httpOnly' => true],
],
- 重写的user组件代码
use Yii;
class MyUser extends \yii\web\User
{
public $loging = false;//登陆过程不能通过cookie身份信息判断是否游客,这个标志为true表示处在登陆过程中
public function getIsGuest()
{
$cookies = Yii::$app->request->cookies;
if(!isset($cookies[$this->identityCookie['name']]) && !$this->loging)
{
$this->switchIdentity(null); //cookie中的身份信息消失了,退出登陆状态
return true; //用户是一个游客
}
return Parent::getIsGuest();
}
public function beforeLogin($identity, $cookieBased, $duration)
{
$this->loging = false;//开始登陆
return parent::beforeLogin($identity, $cookieBased, $duration);
}
public function afterLogin($identity, $cookieBased, $duration)
{
$this->loging = true;//登陆结束
parent::afterLogin($identity, $cookieBased, $duration);
}
}
hrxf168
注册时间:2017-11-13
最后登录:2018-06-05
在线时长:22小时1分
最后登录:2018-06-05
在线时长:22小时1分
- 粉丝2
- 金钱1115
- 威望30
- 积分1635
共 0 条评论