2015-09-26 63 views
3

是否有人知道Symfony认证非常好?Symfony2 SessionUnavailable异常

因为每次尝试在启动后使用新浏览器登录时,我都会收到SessionUnavailable Exception文本“没有会话可用,它超时或Cookie未启用”。为什么我在启动后使用新的浏览器时没有进行新的会话?

我挖得更深一点,在vendor/symfony/symfony/src/Symfony/Component/Security/HTTP/Firewall/AbstractAuthenticationListener.php中找到一个设置为true的选项“require_previous_session”,但我没有如果不知道它实际做了什么,该如何将它设置为假。

任何提示将是伟大的。

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

+1

难道您发布security.yml文件,看你怎么配置呢? – angelwally

回答

5

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

所以ordinarilly,当你建立了一个标准的形式登录(如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(您可以在/user/login上的Symfony工具栏中进行检查),如上面的access_control部分所允许的。

这意味着无论何时有人登录(即将凭据发送至/user/login_check),他们将已经为他们创建会话,而require_previous_session将为true。

对于大多数人来说,这很好,你不必担心这个设置。但是,如果您开始触摸安全组件的边缘,例如创建自己的身份验证提供程序或禁用安全性(特定模式的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 
+0

好的,所以require_previous_session可以是假的没有伤害?我可以在一些配置文件中做到吗?因为在其中一个供应商文件夹中执行它不会被升级到github。 –

+0

我用一个例子编辑了我的答案。您还应该检查安全组件的[参考文档](http://symfony.com/doc/current/reference/configuration/security.html)。 –

+0

@JohnNoel感谢您的详细解释! +1。另外,找出把'require_previous_session'全部放入安全配置的原因是很好的......是否有能力做CSRF验证的唯一原因? –