咨询 Lumen5.4 Session 随机登出问题?

最近遇见Session随机登出的问题,经过几天的摸索(尝试 Google 社区搜索 线上调试),自身能力有限,希望能得到大家的帮助。谢谢!

问题

  • 普通用户登录成功后,在固定几个页面来回切换,Session 会随机重新生成,导致登录失效。
  • 重新生成的Session并不包含user.id。原有的Session 并未过期,依然有效。(打码部分是请求API)
  • 前后端分离(前端 Vue.js v1.0.10 ),单独调用接口并无此问题。

file
图1API请求
file 图2 Redis缓存数据

代码运行环境及相关代码

  • 运行环境:

    • PHP5.6.23(cli),
    • nginx 1.10.1,
    • Redis server v=2.8.19,
    • MySql 5.6,
    • Vue.js v1.0.10
  • Session 配置:

    • driver => redis,
    • connection => session,
    • lifetime => 120,
    • expire_on_close => false,
    • store => null,
    • table => sessions,
    • path => null,
    • domain => null,
    • secure => false,
    • http_only => true,
    • lottery => [2, 100],
  • env 配置:

    • CACHE_DRIVER=redis
    • QUEUE_DRIVER=redis
    • SESSION_DRIVER=redis
  • bootsrap/app.php

    $app->alias('session', \Illuminate\Session\SessionManager::class);
    $app->register(\Illuminate\Session\SessionServiceProvider::class);
    $app->configure('session');
    $app->middleware([\Illuminate\Session\Middleware\StartSession::class]);
    //用户获取和设置Session
    $app->singleton('storage', \App\Auth\WebStorage::class);
  • WebStorage.php (此类用于登录成功后设置Session)

    //获取当前用户
    public function currentUser()
    {
        static $user = null;
        if(!empty($user)) {
            return $user;
        }
        $userId = app('session')->get('user.id', 0);
        if($userId <= 0){
            return -4;
        }
        $user = new User();
        $user->id = $userId;
        return $user;
    }
    
    //设置Session
    public function setCurrentUser(UserBase &$user)
    {
        $userId = $user->id;
        if($userId > 0) {
            app('session')->put('user.id', $userId);
            app('session')->put('user.isCompany', $user->type() == EnterpriseUser::USER_TYPE ? 1 : 0);
            return true;
        }
        return false;
    }
  • Auth中间件 (路由中间件 验证登录态)

    
    public function handle($request, Closure $next, $guard = null)
    {
        $res =$this->auth->guard($guard)->user();
        if ($res instanceof Error) {
            return response([
                'code' => $res->errCode,
                'msg'  => $res->errMsg,
            ], 200);
        }
        return $next($request);
    }
  • AuthServiceProvider.php

    public function boot()
    {
    
        $this->app['auth']->viaRequest('api', function (Request $request) {
    
                $user = app('session')->get('user');
                $userId = isset($user['id']) ? $user['id'] : 0;
                if ($userId > 0) {
                    if(isset($user['isCompany']) && $user['isCompany'] > 0) {
                        return new EnterpriseUser($userId);
                    } else {
                        return new User($userId);
                    }
                }
    
            return new Error(Error::USER_NOT_LOGIN, Error::$MSG[Error::USER_NOT_LOGIN]);
        });
    }
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
最佳答案

我解决了

file

5年前 评论
讨论数量: 10
suhanyujie

你这个会不会是laravel的登录后的有效期到期导致的,config/auth.php中有expire的字段配置,你可以试试

6年前 评论

@suhanyujie 谢谢回答。我用的lumen, 没有配置Auth。 不过确定Session没有过期。

6年前 评论

同意遇到这个问题,求解 :sob:

5年前 评论

@bobby 试一试重新安装下环境。我这生产环境没有问题,问题只出现在测试环境,

5年前 评论

@StevenV 我是本地Apache环境好像没问,但是服务器Nginx环境有问题

5年前 评论

@StevenV 每次请求一次接口都生成一个session,又遇到过不

5年前 评论

@bobby 萌新遇坑

file
确实每次都生存一次session lumen出现的 laravel没问题

5年前 评论

我的是lumen5.7 请问如何解决的

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!