是否有人非常了解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/