我正在symfony开发一个应用程序,有一个公共访问,用户可以用一个登录表单登录,还有一个管理部分,里面有另一个登录表单和另一个用户提供程序。
我为每个区域创建了一个LoginFormAuthenticator,并在每个区域创建了两个防火墙来选择正确的认证器。这是我的安全。yaml:
安全性:提供程序:管理提供程序(_P):实体:类:应用程序\实体\管理员用户属性:电子邮件Web提供商(_P):实体:类:应用\实体\用户属性:电子邮件
firewalls:
admin:
pattern: '^/admin'
anonymous: true
provider: admin_provider
guard:
authenticators:
- App\Security\AdminLoginFormAuthenticator
logout:
path: /admin/logout
target: /
main:
anonymous: true
provider: web_provider
guard:
authenticators:
- App\Security\LoginFormAuthenticator
logout:
path: /logout
现在我向项目中添加了一个/API,两个用户都应该能够访问,如果用户是public用户或admin用户,则不同地管理访问权限。
当在/API区域开发控制器时,我无法在通过管理员登录时获得用户。
问题是,在访问$this-〉getuser()或$this-〉denyAccessUnlessGranted()时,如何在/API中获得管理员用户(如果它已登录)或用户(按此顺序)?
我尝试在主防火墙中添加App\Security\AdminLoginFormAuthenticator,并在main. provider中添加chain_provider,但没有效果。
1条答案
按热度按时间oalqel3c1#
防火墙应该共享一个“公共上下文”,以便能够访问相同的连接用户。我认为这个措辞来自Symfony 2,其中X1 M0 N1 X是存储用户和授权的服务。
您需要稍微修改一下配置,然后
$this->getUser()
和$this->denyAccessUnlessGranted()
将为两个防火墙返回/使用相同的User对象。不需要公共的提供者或自定义的保护。尽管在任何地方使用相同的
User
类可能会更容易,或者为了清晰起见,至少使用公共的角色。