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