hrxf168 2018-01-10 14:24:22 5039次浏览 0条评论 4 1 0

  最近学习yii2利用cookie自动登陆,发现网上的文章都只提到了自动登陆,并没有涉及自动退出的实现,那么,登陆时设置的过期时间有什么作用呢?笔者通过分析源码,通过重载user组件的getIsGeuest()方法,实现了cookie登陆状态的自动退出功能,如有不当,请高手指正,以免贻误他人。(yii2利用session实现自动登陆与自动退出的文章网上很多,yii2的实现也堪称完美,不再赘述)

一、自动退出的实现原理

  yii2中判断用户的登陆状态,是通过检测Yii::$app->user->isGuest实现的,实际是调用了yii\web\user\getIsGuest(),在cookie登陆时,如果满足以下条件,就会往cookie中写入identity信息:

  1. 配置了identityClass并且实现identityInterface接口
  2. user组件配置'enableAutoLogin' => true
  3. 调用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()

二、实现过程和代码如下

  1. user组件中增加配置'class' => 'app\components\MyUser',指向重写的MyUser组件。
        'user' => [
            'class' => 'app\components\MyUser',
            'identityClass' => 'app\models\User',
            'enableAutoLogin' => true,
            'identityCookie' => ['name' => '_identity1', 'httpOnly' => true],
        ],
  1. 重写的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);
    }
}
觉得很赞
    没有找到数据。
您需要登录后才可以评论。登录 | 立即注册