2015-06-17 11:51:04 20473次浏览 4条回答 1 悬赏 0 金钱

先描述一下我遇到的问题,我的session’__userInfo‘ 总是无缘无故消失,
造成Yii::app()->user->getIsGuest() 还是登录状态,
但是Yii::app()->user->__get('u_id')就报错了。
然后我设置了session 过期时间是3秒,但是它过很久也不过期。
我研究了好久,我错过了什么配置吗?

class WebUser extends CWebUser 
{ 

    public function __get($name) 

    { 
        if ($this->hasState('__userInfo')) { 
            $user=$this->getState('__userInfo',array()); 
            if (isset($user[$name])) { 
                return $user[$name]; 
            } else {
                return null;
            }
        } 
        return parent::__get($name); 
    } 

    public function login($identity, $duration) { 
        $this->setState('__userInfo', $identity->getUser()); 
        parent::login($identity, $duration); 
    } 
} 
class WebUserIdentity extends CUserIdentity
{

    private $_id;
    private $_isssd;
    public $realname;
    public $is_login;
    public $user;

    public function authenticate()
    {
        $record = User::model()->findByAttributes(array('email'=>$this->username));
        if($record===null)
        {
            $this->errorMessage = '用户名不存在';
            $this->errorCode=true;
        }
        else if($record->password!==md5($this->password))
        {
            $this->errorMessage = '密码不正确';
            $this->errorCode=true;
        }
        else
        {
            $this->_id=$record->u_id;
            $this->_isssd=$record->u_id;
            $this->errorCode = false;

            $this->setUser($record);
        }
        return !$this->errorCode;
    }

    public function getId()
    {
        return $this->_id;
    }

    public function getUser()
    {
        return $this->user;
    }

    public function setUser($record)
    {
        $this->user=$record;
    }

}

user model

public function check_user($attribute,$params)
{
    $this->_identity = new WebUserIdentity($this->email,$this->password);
    $res = $this->_identity->authenticate();	
    if($res == true){
    	$duration=Yii::app()->params['sessionTimeoutSeconds'];//(=3)
    	Yii::app()->user->login($this->_identity,$duration); 
        return true;
    }else{
        return false;
    }
}

main.php

'session'=>array(
    'class'=>'application.components.WHttpSession',
    'timeout'=>3,
),
  • 回答于 2015-06-17 14:08 举报

    先把官方的文档看一遍,然后看自己的代码流程
    http://www.yiichina.com/doc/guide/2.0/runtime-sessions-cookies

    1 条回复
    回复于 2015-06-23 03:34 回复

    没有收获,谢谢

  • 回答于 2015-06-17 14:46 举报

    建议看看这篇文章,可能 收获更大
    http://www.laruence.com/2012/01/10/2469.html

    1 条回复
    回复于 2015-06-23 03:34 回复

    没有收获,谢谢

  • 回答于 2016-04-29 19:59 举报

    看文档http://www.yiiframework.com/doc-2.0/yii-web-session.html 有个timeout属性,这个总有收获了吧

    3 条回复
    回复于 2016-07-04 14:17 回复

    我没收获到啥,能不能私密指教下

    回复于 2016-07-07 11:11 回复

    了解原理,你给你写下原理:

    这里输入代码
    
    $session = Yii::$app->session;
    //当session没有值 或 过期时间到 则重新付值
    if(!isset($session['user']) || $session['user']['expire_time'] < time()){
        $data = [
          'title' => 'data' . time(),  //数据
          'expire_time' => time() + 10, //这里设置10秒过期
        ];
        $session['user'] = $data;
    }
    
    var_dump($session['user']);
    
    

    知道这个原理,你就可以封装函数了,比如封装一个设置过期的session函数了

    回复于 2016-07-07 11:13 回复

    了解原理,你给你写下原理:

    这里输入代码
    
    $session = Yii::$app->session;
    //当session没有值 或 过期时间到 则重新付值
    if(!isset($session['user']) || $session['user']['expire_time'] < time()){
        $data = [
          'title' => 'data' . time(),  //数据
          'expire_time' => time() + 10, //这里设置10秒过期
        ];
        $session['user'] = $data;
    }
    
    var_dump($session['user']);
    
    

    知道这个原理,你就可以封装函数了,比如封装一个设置过期的session函数了

  • 回答于 2018-09-03 16:26 举报

    Yii2 框架 配置文件注意cookieParams配置

        'session' => [
            // this is the name of the session cookie used for login on the backend
            'name' => 'advanced-backend',
            'class' => 'yii\redis\Session',
            'timeout' => 3600,
            'cookieParams' => [
                'lifetime' => 36000,
                'httponly' => true
            ],
            'redis' => [
                'hostname' => 'localhost',
                'port' => 6379,
                'database' => 0,
            ],
        ],
        
    

    登录过期时间还有一处需注意,且看下面Yii2在登录时官方源代码做了什么,如下:
    \advanced\common\models\LoginForm.php 第60行位置

    /**
     * Logs in a user using the provided username and password.
     *
     * @return bool whether the user is logged in successfully
     */
    public function login()
    {
        if ($this->validate()) {
            return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
        }
        
        return false;
    }
    
    可知,在登录勾选“Remember me”后,Yii2自动将登录成功后的状态设置为一个月过期了,所以你感觉是session设置过期时间无效。
    
    
    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
晨泽
实习生

晨泽

注册时间:2013-03-19
最后登录:2015-08-16
在线时长:0小时49分
  • 粉丝0
  • 金钱10
  • 威望0
  • 积分10

热门问题