Symfony2 SessionUnavailable Exception

Rub*_*vnå 5 php authentication session exception symfony

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

因为每次我尝试在启动后使用新浏览器登录时,都会收到SessionUnavailable Exception,其中包含"没有可用会话,超时或未启用cookie"的文本.为什么我在启动后使用新浏览器时没有进行新的会话?

我挖得更深一点,发现一个选项"require_previous_session"设置为true:vendor/symfony/symfony/src/Symfony/Component/Security/HTTP/Firewall/AbstractAuthenticationListener.php,但我不知道如何设置它在不知道它实际做了什么的情况下做错.

任何提示都会很棒.

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

Joh*_*oel 7

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

因此,当您在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 }
Run Code Online (Sandbox Code Playgroud)

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

这意味着只要有人登录(即发送凭证/user/login_check),他们就已经为他们创建了一个会话,并且require_previous_session是真的.

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

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

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

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

firewalls:
    default:
        pattern: ^/user
        anonymous: ~
        form_login:
            login_path: /user/login
            check_path: /user/login_check
            require_previous_session: false
Run Code Online (Sandbox Code Playgroud)