我正在尝试使用Symfony 3.1完成我的注销功能,但到目前为止还没有工作。我正在逐步遵循书籍文档,但我得到的是一个未被发现的例外:
无法找到路径" / logout"的控制器。路线是错误的 构造
我确实在security.yml文件中激活了正确的配置参数(logout)
security:
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
anonymous: ~
# activate different ways to authenticate
form_login:
login_path: login
check_path: login
secured_area:
anonymous: ~
logout:
path: /logout
target: /
我确实在routing.yml中创建了一个路由:
logout:
path: /logout
根据文档,它不需要控制器,但例外情况表明控制器路径是错误的。
我做错了什么?
答案 0 :(得分:4)
我认为这是因为您定义了两个防火墙。暂时,摆脱secure_area的东西,尝试类似的东西:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
anonymous: ~
switch_user: true
form_login:
provider: user_provider
login_path: user_login
check_path: user_login_check
default_target_path: app_welcome
username_parameter: username
password_parameter: password
csrf_parameter: _csrf_token
csrf_token_id: authenticate
csrf_token_generator: security.csrf.token_manager
logout:
path: user_logout
target: app_welcome
请注意,注销部分位于主防火墙下。一旦你有主防火墙工作,你可以尝试重新添加secured_area,如果你真的需要它。
是的,我懒得,只是复制/粘贴了一个有效的配置。你必须调整路线以匹配你的路线。
答案 1 :(得分:1)
如果要使用两个防火墙,则可能还需要两个具有两个注销路径的登录表单。
在每个防火墙都能识别的“模式”中添加断开连接的连接路由很重要
路由配置:
# config/routes.yaml
logout_medical:
path: /logout-medical
logout_patient:
path: /logout-patient
# I omitted the declaration of the connection routes because they are made with annotations in the controllers
防火墙配置:
# config/packages/security.yaml
security:
# ...
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/(logout-medical|login-medical|m)
anonymous: ~
provider: medical_provider
form_login:
login_path: login_medical
check_path: login_medical
logout:
path: logout_medical
target: login_medical
patient_area:
pattern: ^/(logout-patient|login-patient|p)
anonymous: ~
provider: patient_provider
form_login:
login_path: login_patient
check_path: login_patient
logout:
path: logout_patient
target: login_patient
答案 2 :(得分:1)
感谢最正确的答案。您还应该知道另一个技巧: 确保/ logout位于防火墙后面。 / logout路径必须匹配防火墙模式。
例如:“模式:^ / admin”,则注销路径应为“ / admin / logout”。
答案 3 :(得分:0)
因为您很可能没有与该路线相关联的控制器。 如果您使用的是像FOSUser这样的软件包,则只需要导入该软件包提供的routing.yml。如果您没有任何捆绑/控制器来处理该路由,您必须实施一个。
答案 4 :(得分:0)
为Cerad的答案添加更多细节:Symfony中的安全用户绑定到"安全上下文"默认情况下,它对应于防火墙。在您的情况下,您希望退出已强制执行form_login身份验证要求的上下文("防火墙"),因此需要在" main&#34上设置您的注销配置;防火墙,而不是一个名为" secured_area"。
的新防火墙文档使用防火墙名称" secured_area"仅作为一种方式,表明此配置旨在用于保护您网站的一部分的防火墙中。它并不打算将该名称直接复制到您的配置中;相反,在您的情况下,您尝试保护的防火墙称为" main"。从这个意义上说,documentation有点令人困惑,因为在其他任何地方它只使用一个名为" main"例如,包括设置安全区域的示例。所以我想如果使用" main"可能会更好。在这个特殊的例子中。
此外,您需要确保注销路径(路径)实际上由您已配置它的防火墙处理,而不是被捕获"由不同的防火墙。在你的情况下,这将自动发生,因为你没有对你的"主要"防火墙,所以它抓住了一切。