Yii2登录时间问题

user组件里配置session超时时间;

Yii::$app->user->login()方法控制cookie的超时时间;

如果两个都超时了,就要重新登录。

'user' => [
    'identityClass' => 'common\models\system\User',
    'identityCookie' => ['name' => '_identity-backend', 'httpOnly' => true],
    'enableAutoLogin' => true,  // 启用基于 cookie 的登录
    'authTimeout' => 60,  // session 超时时间
    'loginUrl' => 'site/login'  //登录首页
]

看一下User::switchIdentity()方法,该方法设置登录用户的session和cookie,代码如下:

public function switchIdentity($identity, $duration = 0)
{
    // 省略一部分...
  if ($identity) {
    $session->set($this->idParam, $identity->getId());  // 设置一个session,将用户的id保存到session id为__id
    if ($this->authTimeout !== null) {
      $session->set($this->authTimeoutParam, time() + $this->authTimeout);  // 当$authTimeout不为null时,设置一个超时时间,session id为__expire
    }
    if ($this->absoluteAuthTimeout !== null) {
      $session->set($this->absoluteAuthTimeoutParam, time() + $this->absoluteAuthTimeout);  // 当$absoluteAuthTimeout不为null时,设置一个绝对超时时间,session id为__absoluteExpire
    }
    if ($this->enableAutoLogin && $duration > 0) {
      $this->sendIdentityCookie($identity, $duration);  // 当$enableAutoLogin = true并且$duration > 0时,设置一个cookie,以便session过期后,可以通过cookie自动登录
    }
  }
}

当用户超过一定的时间没有请求访问时,需重新登录,修改配置里的user组件里的authTimeout值,单位是秒。

当用户一段时间内没有访问或者关闭浏览器时,且没有超过一定的时间内时,再次访问时,无需重新登录时,可以通过调用user::login()方法,来实现该功能($enableAutoLogin必须为true),代码如下:

public function login()
{
    if ($this->validate()) {
        //return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
        return Yii::$app->user->login($this->getUser(), 1200);
    }
    return false;
}

只要cookie没有失效(超过1200秒),就可以通过cookie自动登录,而不需要重新输入登录。

Yii2自动登录代码:

protected function renewAuthStatus()
{
    $session = Yii::$app->getSession();
    $id = $session->getHasSessionId() || $session->getIsActive() ? $session->get($this->idParam) : null;
 
    if ($id === null) {
        $identity = null;
    } else {
        /* @var $class IdentityInterface */
        $class = $this->identityClass;
        $identity = $class::findIdentity($id);
    }
 
    $this->setIdentity($identity);
 
    if ($identity !== null && ($this->authTimeout !== null || $this->absoluteAuthTimeout !== null)) {
        $expire = $this->authTimeout !== null ? $session->get($this->authTimeoutParam) : null;
        $expireAbsolute = $this->absoluteAuthTimeout !== null ? $session->get($this->absoluteAuthTimeoutParam) : null;
        if ($expire !== null && $expire < time() || $expireAbsolute !== null && $expireAbsolute < time()) {
            $this->logout(false);
        } elseif ($this->authTimeout !== null) {
            $session->set($this->authTimeoutParam, time() + $this->authTimeout);
        }
    }
 
    if ($this->enableAutoLogin) {
        if ($this->getIsGuest()) {
            $this->loginByCookie();
        } elseif ($this->autoRenewCookie) {
            $this->renewIdentityCookie();
        }
    }
}
 
protected function loginByCookie()
{
    $data = $this->getIdentityAndDurationFromCookie();
    if (isset($data['identity'], $data['duration'])) {
        $identity = $data['identity'];
        $duration = $data['duration'];
        if ($this->beforeLogin($identity, true, $duration)) {
            $this->switchIdentity($identity, $this->autoRenewCookie ? $duration : 0);
            $id = $identity->getId();
            $ip = Yii::$app->getRequest()->getUserIP();
            Yii::info("User '$id' logged in from $ip via cookie.", __METHOD__);
            $this->afterLogin($identity, true, $duration);
        }
    }
}

上面代码解析:

1、获取session中的用户id

2、根据用户id获取用户信息

3、判断session是否过期,未过期,则更新session;已过期,则注销用户

4、如果启用了基于cookie的登录。如果是来宾,则获取cookie信息,未过期则自动登录用户。如果不是来宾,则更新cookie信息

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注