Symfony 会话不可用异常

Posted

技术标签:

【中文标题】Symfony 会话不可用异常【英文标题】:Symfony2 SessionUnavailable Exception 【发布时间】:2015-12-24 12:16:01 【问题描述】:

是否有人非常了解 Symfony 身份验证?

因为每次我在启动后尝试使用新浏览器登录时,都会收到 SessionUnavailable 异常,并显示“无可用会话,它已超时或未启用 cookie”。为什么我在启动后使用新浏览器时没有创建新会话?

我挖得更深一点,发现一个选项“require_previous_session”在:vendor/symfony/symfony/src/Symfony/Component/Security/HTTP/Firewall/AbstractAuthenticationListener.php 中设置为 true,但我不知道在不知道它实际做什么的情况下将其设置为 false。

任何提示都会很棒。

Security.yml 文件因为角色系统而相当大,但请看这里: Security.yml

【问题讨论】:

您能否发布您的 security.yml 文件以查看您的配置方式? 【参考方案1】:

require_previous_session 设置有点倾斜,但可以(希望)用一些代码来解释。

所以通常情况下,当您设置标准表单登录(如the docs)时,在您的security.yml 文件中设置您的防火墙模式(如/user)并设置anonymous 选项。现在,在您的访问控制中,您将登录页面(例如/user/login)设置为具有IS_AUTHENTICATED_ANONYMOUSLY 的角色,如下所示:

firewalls:
    default:
        pattern: ^/user
        anonymous: ~
        form_login:
            login_path: /user/login
            check_path: /user/login_check

access_control:
    -  path: ^/user/login, roles: IS_AUTHENTICATED_ANONYMOUSLY 
    -  path: ^/user, roles: ROLE_USER 

现在,当有人转到/user 时会发生什么,他们会被转发到/user/login但是当他们这样做时,他们将为他们创建一个会话(如果他们还没有)并且他们分配的角色将是 anon(你可以在 @987654333 上时在 Symfony 工具栏中检查这个@) 如上面的access_control 部分所允许的那样。

这意味着无论何时有人登录(即向/user/login_check 发送凭据),他们都已经为他们创建了一个会话,require_previous_session 将为真。

对于大多数人来说,这很好,您不必担心此设置。但是,如果您开始接触安全组件的边缘,例如,创建您自己的身份验证提供程序,或禁用安全性(security: false 用于特定模式,请参阅默认的dev 防火墙以获取此示例),那么您可以遇到这个问题。

据我所知,在您登录之前没有进行会话不会造成安全损失 - 我有生产站点去这种情况。但是,这样做的好处是您可以在登录表单上使用 CSRF 令牌 (cookbook entry) 以提高安全性,这意味着对用户帐户的攻击要困难得多。

短版:如果它可以解决您的问题,我不会担心设置该选项。根据您的站点大小,这样做可能会提高性能(如果您可以登录整个站点但未经身份验证的用户不需要会话),但在安全方面,您应该很好。

编辑,上面的示例,require_previous_session 设置为 false:

firewalls:
    default:
        pattern: ^/user
        anonymous: ~
        form_login:
            login_path: /user/login
            check_path: /user/login_check
            require_previous_session: false

【讨论】:

好的,所以 require_previous_session 可以是假的而没有伤害?我可以在某些配置文件中执行此操作吗?因为在其中一个供应商文件夹中执行此操作不会上传到 github。 我已经用一个例子编辑了我的答案。您还应该检查安全组件的reference documentation。 @JohnNoel 谢谢你的详细解释! +1。此外,最好弄清楚将require_previous_session 完全放入安全配置的原因......能够进行 CSRF 验证是唯一的原因吗?

以上是关于Symfony 会话不可用异常的主要内容,如果未能解决你的问题,请参考以下文章

会话在某些 rspec 文件中可用,而在其他文件中不可用。怎么会?

Tomcat SSL - IllegalStateException:SSL 会话 ID 不可用

电脑开机然后显示本地会话管理器服务登陆失败,rpc服务器不可用,然后一直重启

由于错误 2,异常 GooglePlayServices 不可用 [重复]

无法摆脱“物理连接不可用”异常

为啥 Android Geocoder 会抛出“服务不可用”异常?