关于fecmall的前台后台登陆超时设置问题

技术分享 · Fecmall · 于 3年前 发布 · 1429 次阅读

1.关于超时时间:

以appadmin为例子

@fecshop\models\mysqldb\adminUser\AdminUserLogin.php

/**
     * @param $duration | Int
     * 对于参数$duration:
     * 1. 当不开启cookie时,$duration的设置是无效的,yii2只会从user组件Yii::$app->user->authTimeout
     *    中读取过期时间
     * 2. 当开启cookie,$duration是有效的,会设置cookie的过期时间。
     *	  如果不传递时间,默认使用 Yii::$service->session->timeout的值。
     * 总之,为了方便处理cookie和session的超时时间,统一使用
     * session的超时时间,这样做的好处为,可以让account 和 cart session的超时时间保持一致
     */
    public function login($duration = 0)
    {
        
        if (!$duration) {
            if (Yii::$service->session->timeout) {
                $duration = Yii::$service->session->timeout;
            }
        }
        
        if ($this->validate()) {
            
            //return \Yii::$app->user->login($this->getAdminUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
            return \Yii::$app->user->login($this->getAdminUser(), $duration);
        } else {
            return false;
        }
    }

超时时间是:$duration = Yii::$service->session->timeout;

因此,超时时间就是session services设置的timeout的值

2.找到这个session services文件

@fecshop/services/Session.php

public function init()
    {
        parent::init();
        if (\Yii::$app->user->enableSession == true) {
            $this->_session = new SessionPhp; // phpsession
        } else {
            $currentService = $this->getStorageService($this);
            $this->_session = new $currentService();
            /*
            if ($this->storageEngine == 'mongodb') {
                $this->_session = new MongoDbSession;
            }else if ($this->storageEngine == 'mysqldb') {
                $this->_session = new MysqlDbSession;
            }else if ($this->storageEngine == 'redis') {
                $this->_session = new RedisSession;
            }
            */
        }
        $appName = Yii::$service->helper->getAppName();
        $accessTokenTimeoutConfig = Yii::$app->store->get($appName.'_base', 'customer_access_token_timeout');
        $accessTokenUpdateTimeLimitConfig = Yii::$app->store->get($appName.'_base', 'customer_access_token_update_time_limit');
        $this->timeout = $accessTokenTimeoutConfig ? $accessTokenTimeoutConfig : 86400 ;
        $this->updateTimeLimit = $accessTokenUpdateTimeLimitConfig ? $accessTokenUpdateTimeLimitConfig : 600 ;
        // var_dump([$this->timeout, $this->updateTimeLimit]);
    }

可以看到代码:

$accessTokenTimeoutConfig = Yii::$app->store->get($appName.'_base', 'customer_access_token_timeout');

$this->timeout = $accessTokenTimeoutConfig ? $accessTokenTimeoutConfig : 86400 ;

这里的值,从后台配置值取,如果取不到,则使用86400秒

只有appserver后台入口进行了后台配置,后台菜单:网站配置 --> Appserver配置 --> 基础配置

对于appfrontappserver,该值直接使用了默认86400(秒),也就是24小时

这个地方的处理,不够完美,后面看看优化处理一下

3.登陆是基于cookie的,因此将浏览器关掉重新打开,还是登陆的

以appadmin为例子,打开文件@fecshop/app/appadmin/config/appadmin.php

找到组件配置,如下:

'components' => [
        'user' => [
            'identityClass' => 'fecshop\models\mysqldb\AdminUser',
            'enableAutoLogin' => true,
        ],

enableAutoLogin设置为true,即开启cookie登陆。

共收到 3 条回复
Fecmall#13年前 0 个赞

后台优化一下,加入appfront,apphtml5,appadmin的 登陆超时配置。

cqslxz#23年前 0 个赞

测试了下,发现AppadminController文件里面的ini方法里的Yii::$service->url->redirectByUrlKey('/fecadmin/login/index');如果是登录后进入管理界面不操作,一段时间过期后,点击菜单会出现的提示,直接F5刷新是可以直接跳到登录界面,请问作者有什么好的想法和建议吗?我想了些测试都达不到过期直接跳登录的效果,非常感谢!

Fecmall#33年前 0 个赞

@cqslxz #2楼

这个您自己搞一下吧

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics