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

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

我进行了更深入的研究,发现其中一个设置为true的选项“require_previous_session”:vendor/symfony/symfony/src/Symfony/Component/Security/HTTP/Firewall/AbstractAuthenticationListener.php,但我没有对其进行设置在不知道其实际作用的情况下为假。

任何提示将是伟大的。

由于角色系统的缘故,Security.yml文件很大,请在此处查看:
Security.yml

最佳答案

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;但是,当他们这样做时,他们将为他们创建一个 session (如果尚未创建),并且分配的角色将是anon(您可以在/user/login上的Symfony工具栏中查看该字符),这是上述access_control部分允许的。

这意味着只要有人登录(即,将凭据发送到/user/login_check),他们就已经为他们创建了一个 session ,并且require_previous_session将为true。

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

据我所知,在您登录之前不进行 session 不会对安全性造成任何影响-在这种情况下,我会让生产站点进入。但是,这样做的好处是您可以在登录表单上使用CSRF token (cookbook entry)来提高安全性,这意味着对用户帐户的攻击要困难得多。

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

从上面编辑示例,将require_previous_session设置为false:
firewalls:
    default:
        pattern: ^/user
        anonymous: ~
        form_login:
            login_path: /user/login
            check_path: /user/login_check
            require_previous_session: false

关于php - Symfony2 SessionUnavailable异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32802932/

10-11 22:32
查看更多