我使用symfony.com的"Using a traditional login form"教程来验证我的用户身份。使用简单的http auth,效果很好。
提交登录后,我得到了这个例外:
无法找到路径“/ login_check”的控制器。可能是你 忘了在路由配置中添加匹配路由了吗?
好吧,在教程中我读到了:
您不需要为/ login_check URL实现控制器,因为防火墙将自动捕获并处理提交到此URL的任何表单。
我定义了路由并设置了防火墙设置:
security.yml
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
backend:
pattern: ^/backend
anonymous: ~
form_login:
provider: entity
login_path: /login
check_path: /login_check
#use_forward: true
logout:
path: /logout
target: /
的routing.yml
login:
pattern: /login
defaults: { _controller: VitaSecurityBundle:Default:login }
login_check:
pattern: /login_check
logout:
pattern: /logout
答案 0 :(得分:18)
此处描述了您遇到的问题:
参见http://symfony.com/doc/current/book/security.html,“避免常见陷阱”一节
- 确保
醇>/login_check
位于防火墙后面 接下来,确保您的check_path URL(例如/ login_check)位于您用于表单登录的防火墙后面(在此示例中,单个防火墙匹配所有URL,包括/ login_check)。如果/ login_check与任何防火墙都不匹配,您将收到无法找到路径“/ login_check”异常的控制器。
在此示例中,您的模式为安全路径指定/ backend的前缀。为了工作,您的登录检查应该在同一个防火墙后面。
因此,要匹配您在防火墙中指定的模式,请将login_check放在url路径上,如下所示:/ backend / login_check
答案 1 :(得分:8)
我在路径中添加了/ backend前缀,删除了'anonymous:〜'行并注释掉了后端的ACL。
<强> security.yml 强>
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login_firewall:
pattern: ^/backend/login$
anonymous: ~
backend:
pattern: ^/backend
form_login:
provider: entity
login_path: /backend/login
check_path: /backend/login_check
#use_forward: true
logout:
path: /backend/logout
target: /
access_control:
#- { path: ^/backend, roles: ROLE_USER }
<强>的routing.yml 强>
login:
pattern: /backend/login
defaults: { _controller: VitaSecurityBundle:Default:login }
login_check:
pattern: /backend/login_check
logout:
pattern: /backend/logout
答案 2 :(得分:1)
当您有两个具有相同模式的防火墙时,问题也会发生。例如:
....
backend:
pattern: ^/*
....
frontend:
pattern: ^/*
您必须按如下方式更改其中一个:
....
backend:
pattern: ^/(administrador|backend)/*
....
frontend:
pattern: ^/*
答案 3 :(得分:0)
以下是我在现实生活中使用的示例代码:
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
secured_area:
pattern: ^/cmd
anonymous: ~
form_login:
check_path: /cmd/login_check
login_path: /cmd/login
remember_me:
always_remember_me: true
key: "%secret%"
path: /cmd
domain: ~ # Defaults to the current domain from $_SERVER
logout:
path: /cmd/logout
target: /
admin:
pattern: ^/admin
http_basic:
realm: "Administration"
free_area:
pattern: ^/
anonymous: ~
在我的情况下,只有/ cmd / part是安全的,/ admin / part也是安全的,但具有HTTP安全性。
也许你应该尝试: security.yml
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
backend:
pattern: ^/backend
anonymous: ~
form_login:
provider: entity
login_path: /backend/login
check_path: /backend/login_check
#use_forward: true
logout:
path: /backend/logout
target: /
和routing.yml:
login:
pattern: /backend/login
defaults: { _controller: VitaSecurityBundle:Default:login }
login_check:
pattern: /backend/login_check
logout:
pattern: /backend/logout
我认为你的问题可能来自你/ part中没有激活安全性的事实(你的安全区域的模式是^ / backend)
答案 4 :(得分:0)
这不适合我,我尝试了别的东西:
firewalls:
dev:
pattern: ^/(_profiler|_wdt|css|js)
security: false
login:
pattern: ^/login$
security: false
secured_area:
pattern: /(admin/.*|login_check)
provider: in_memory
form_login:
check_path: /login_check
login_path: /login
default_target_path: /admin
always_use_default_target_path: true
logout:
path: /logout
target: /
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_ADMIN }
通过以下说明,比zabojad的说明更简单。 重要的是将login_check路由放在防火墙内并让登录到外面。使用或模式,您可以成功。
最高