Session Laravel4.2——新数据库会话“;“存在”;,不保存+;jasny/sso

Session Laravel4.2——新数据库会话“;“存在”;,不保存+;jasny/sso,session,laravel,laravel-4,single-sign-on,Session,Laravel,Laravel 4,Single Sign On,长话短说:我已经黑了jasny/sso来与Laravel合作。除非主/根会话已过期,否则它工作得非常好 我将主/根身份验证设置为“记住”,这样当会话过期时,它可以从cookie重新身份验证 当SSO服务器上发生“附加”操作且主/根会话已过期时,我将运行Auth::check()使会话恢复活力,以便可以正确附加会话 我所有的调试都表明,除了以下一个小细节外,一切都完全按照我的需要进行: 由“attach”操作生成的新会话从未写入数据库,因为DatabaseSessionHandler认为它已经存在

长话短说:我已经黑了jasny/sso来与Laravel合作。除非主/根会话已过期,否则它工作得非常好

我将主/根身份验证设置为“记住”,这样当会话过期时,它可以从cookie重新身份验证

当SSO服务器上发生“附加”操作且主/根会话已过期时,我将运行Auth::check()使会话恢复活力,以便可以正确附加会话

我所有的调试都表明,除了以下一个小细节外,一切都完全按照我的需要进行:

由“attach”操作生成的新会话从未写入数据库,因为DatabaseSessionHandler认为它已经存在。它正在运行更新而不是插入。

因此,我的SSO客户端会话连接到一个不存在的SSO服务器会话

就我个人而言,我无法理解为什么它认为这个新会话已经存在,也无法理解如何让它正确地插入到数据库中

有人能告诉我为什么一个新的Laravel 4.2会话会被检测为“存在”,并在save()上运行UPDATE而不是INSERT

额外的调试尝试--

尝试#1:我跟踪到一个过期会话的错误附件,该会话尚未被垃圾收集。我不明白的是,当呈现不同的会话ID时,如何加载此会话。如果这是migrate()或regenate()方法的结果,“exists”将设置为false,并且它将正确保存。不知何故,会话ID似乎在更新时没有重置“exists”


尝试2:答案一直在我面前。我有点理解现在的否决票。(见下面我的答案)

当我试图揭示行为背后的机制而不是测试看似简单的解决方案时,我戏剧性地过度思考了这个问题:

如果在Session::save()之前调用Session::setExists(false),它将正确插入新会话


编辑:如果包装在Auth::vialember()的If语句中,我可以通过会话或cookie/memory检查是否发生了身份验证。如果为true,那么我想将“exists”设置为false。

不加解释地进行下一票?经典移动。当会话实际上仍然存在时,这会导致错误。编辑以解决上述注释。