Symfony2 SessionUnavailable Exception

时间:2015-09-26 23:07:50

标签: php symfony session authentication exception

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

因为每次我尝试在启动后使用新浏览器登录时,我都会获得带有文本"没有可用会话的SessionUnavailable Exception,它会超时或者没有启用cookie。"当我在启动后使用新浏览器时,为什么不进行新的会话?

我挖了一点,发现了一个选项&#34; require_previous_session&#34;在以下位置设置为true:vendor / symfony / symfony / src / Symfony / Component / Security / HTTP / Firewall / AbstractAuthenticationListener.php,但我不知道将其设置为false而不知道它实际上做了什么。< / p>

任何提示都会很棒。

由于角色系统,Security.yml文件非常大,但请看一下: Security.yml

1 个答案:

答案 0 :(得分:7)

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

通常,当您设置标准表单登录(例如the docs)时,在security.yml文件中,您使用模式设置防火墙(例如/user)并设置{ {1}}选项。现在,在您的访问控制中,您将登录页面(例如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(你可以在Symfony工具栏中查看这个)如上anon部分所允许的那样,在/user/login)上。

这意味着只要有人登录(即将凭据发送到access_control),他们就会为他们创建会话,并且/user/login_check将为真。

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

据我所知,在您登录之前没有会话没有安全惩罚 - 我有生产网站在这种情况下。但是,有一个好处是,您可以在登录表单上使用CSRF令牌(cookbook entry)以获得额外的安全性,这意味着对用户帐户的攻击要困难得多。

简短版本:如果它解决了您的问题,我不会担心设置该选项。这取决于您的网站规模,这样做可以获得性能提升(如果您可以登录整个网站,但未经身份验证的用户不需要会话),但安全性方面,您应该做得很好。

编辑,示例从上面开始,dev设置为false:

require_previous_session