Symfony 2 多个提供商无法在 secuirty.yml 中工作
Symfony 2 Multiple providers not working in secuirty.yml
我有多个提供者用户和管理员,所以我关注 security.yml
security:
encoders:
AppBundle\Entity\AdminUser: bcrypt
# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
#in_memory:
# memory: ~
admin_db:
entity: { class: AppBundle\Entity\AdminUser, property: email }
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin_db:
provider: admin_db
anonymous: false
form_login:
login_path: login
check_path: login
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
#http_basic: ~
# https://symfony.com/doc/current/security/form_login_setup.html
#form_login: ~
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_ADMIN }
但是当我尝试访问登录页面时,我看到了这个错误
This page isn’t working localhost redirected you too many times. Try
clearing your cookies. ERR_TOO_MANY_REDIRECTS
问题是您的防火墙不允许 anonymous: false
指定的任何匿名访问。这意味着您的登录访问控制不起作用。解决此问题的 2 种常见方法是将登录路由从防火墙中取出或允许匿名访问,然后使用 access_controls 来要求角色。
如果要将登录路由移出:
firewalls:
login:
pattern: ^/login$
security: false
admin_db:
...
form_login:
login_path: login
check_path: login_check
重要的是路由 login_check
指向防火墙内的某处。所以基本上除了 /login
之外的任何东西都可以工作,例如login/check
。在您的控制器中,您可以为此创建一个空操作,也可以将其指向与登录相同的操作。
对于你的情况,另一个解决方案会更简单,因为你的 access_control
已经正确了:
firewalls:
admin_db:
...
anonymous: ~
在您的访问控制中,您允许匿名访问登录,但所有其他路由必须具有 ROLE_ADMIN
。因此,无需进行其他更改。
我有多个提供者用户和管理员,所以我关注 security.yml
security:
encoders:
AppBundle\Entity\AdminUser: bcrypt
# https://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
#in_memory:
# memory: ~
admin_db:
entity: { class: AppBundle\Entity\AdminUser, property: email }
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
admin_db:
provider: admin_db
anonymous: false
form_login:
login_path: login
check_path: login
# activate different ways to authenticate
# https://symfony.com/doc/current/security.html#a-configuring-how-your-users-will-authenticate
#http_basic: ~
# https://symfony.com/doc/current/security/form_login_setup.html
#form_login: ~
access_control:
- { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/, roles: ROLE_ADMIN }
但是当我尝试访问登录页面时,我看到了这个错误
This page isn’t working localhost redirected you too many times. Try clearing your cookies. ERR_TOO_MANY_REDIRECTS
问题是您的防火墙不允许 anonymous: false
指定的任何匿名访问。这意味着您的登录访问控制不起作用。解决此问题的 2 种常见方法是将登录路由从防火墙中取出或允许匿名访问,然后使用 access_controls 来要求角色。
如果要将登录路由移出:
firewalls:
login:
pattern: ^/login$
security: false
admin_db:
...
form_login:
login_path: login
check_path: login_check
重要的是路由 login_check
指向防火墙内的某处。所以基本上除了 /login
之外的任何东西都可以工作,例如login/check
。在您的控制器中,您可以为此创建一个空操作,也可以将其指向与登录相同的操作。
对于你的情况,另一个解决方案会更简单,因为你的 access_control
已经正确了:
firewalls:
admin_db:
...
anonymous: ~
在您的访问控制中,您允许匿名访问登录,但所有其他路由必须具有 ROLE_ADMIN
。因此,无需进行其他更改。