Symfony 4:如何在防火墙中为用户/管理员提供多个提供者?
Posted
技术标签:
【中文标题】Symfony 4:如何在防火墙中为用户/管理员提供多个提供者?【英文标题】:Symfony 4 : How to have multi providers for user/admin in firewall? 【发布时间】:2019-05-16 10:46:19 【问题描述】:我不能使用两种不同的表单为用户和管理员提供两个不同的提供程序
我想为用户和管理员设置两个防火墙。我创建了两个不同的提供者链接两个不同的实体。我可以以用户身份登录,但不能以管理员身份登录。我不明白我需要添加更多内容。
另外,我知道有app.user。但是还有 app.admin 吗?为了在两个不同的防火墙上拥有两个完全独立的帐户?
security:
providers:
user_provider:
entity:
class: App\Entity\User
property: username
admin_provider:
entity:
class: App\Entity\Admin
property: username
chain_provider:
chain:
providers: [user_provider, admin_provider]
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/
provider: user_provider
anonymous: true
logout:
path: /logout
target: /login
remember_me:
secret: '%kernel.secret%'
lifetime: 604800 # 1 week in seconds
path: /
form_login:
login_path: /login
check_path: /login
backoffice:
pattern: ^/backoffice
provider: admin_provider
logout:
path: /backoffice/logout
target: /backoffice/login
form_login:
login_path: /backoffice/login
check_path: /backoffice/login
access_control:
- path: ^/backoffice/login, roles: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/backoffice, roles: ROLE_ADMIN
- path: ^/mon-compte, roles: ROLE_USER
encoders:
App\Entity\User:
algorithm: bcrypt
cost: 12
App\Entity\Admin:
algorithm: bcrypt
cost: 12
当我调用$authenticationUtils->getLastAuthenticationError()
时出现null
错误
【问题讨论】:
【参考方案1】:切换防火墙顺序,所以main
防火墙是最后一个。
Symfony 每个请求只使用一个防火墙,它是第一个与pattern
匹配的防火墙。因此,在您的情况下,它也将main
防火墙用于^/backoffice
url,因为/backoffice
匹配^/
模式。
我不确定它是否能解决您的所有问题,但您需要这样做才能真正使用backoffice
防火墙。
关于app.user
和app.admin
- 不,没有app.admin
。管理员也是一个用户,所以当你以管理员身份登录时,你会得到它的实体app.user
【讨论】:
谢谢你,它帮助了我!我在理解我的错误的同时阅读了您的答案。在我的手防火墙上,我有一个 user = test 在我的防火墙管理员上我有一个 user = admin 两者都可以存在于两个防火墙上。这对我来说是一件非常好的事情。还是非常感谢 !已解决!【参考方案2】:这是我更新的 security.yaml :
security:
providers:
admin_provider:
entity:
class: App\Entity\Admin
property: username
user_provider:
entity:
class: App\Entity\User
property: username
chain_provider:
chain:
providers: [user_provider, admin_provider]
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
backoffice:
pattern: ^/backoffice
provider: admin_provider
anonymous: true
logout:
path: admin.logout
target: admin.login
form_login:
login_path: admin.login
check_path: admin.login
default_target_path: admin.index
main:
pattern: ^/
provider: user_provider
anonymous: true
logout:
path: logout
target: login
remember_me:
secret: '%kernel.secret%'
lifetime: 604800 # 1 week in seconds
path: /
form_login:
login_path: login
check_path: login
access_control:
- path: ^/backoffice/login, roles: IS_AUTHENTICATED_ANONYMOUSLY
- path: ^/backoffice, roles: ROLE_ADMIN
- path: ^/mon-compte, roles: ROLE_USER
encoders:
App\Entity\User:
algorithm: bcrypt
cost: 12
App\Entity\Admin:
algorithm: bcrypt
cost: 12
【讨论】:
以上是关于Symfony 4:如何在防火墙中为用户/管理员提供多个提供者?的主要内容,如果未能解决你的问题,请参考以下文章