我正在用symfony开发和应用程序,具有公共访问权限,用户使用登录表单登录,并使用另一个登录表单和另一个用户提供程序登录admin部分。
我为每个区域创建了一个LoginFormAuthenticator,并使用两个防火墙在每个区域中选择了正确的身份验证器。这是我的security.yaml:
安全性: 提供者: admin_provider: 实体: 类别:App \ Entity \ AdminUser 财产:电子邮件 web_provider: 实体: 类别:App \ Entity \ User 财产:电子邮件
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,并且如果该用户是公共用户或管理员用户,则两个用户都应该能够分别访问,管理访问权限。
在/ api区域中开发控制器时,通过管理员登录时无法获得用户。
问题是,如果使用AdminUser登录,则如何在/ api中获取它;访问$ this-> getuser()或$ this-> denyAccessUnlessGranted()时,如何获取该用户(按此顺序)?
我尝试在主防火墙中添加App \ Security \ AdminLoginFormAuthenticator,并在main.provider中添加chain_provider。但这不起作用。
谢谢。
答案 0 :(得分:0)
防火墙应共享“公共上下文”,以便能够访问相同的连接用户。我认为该措辞来自Symfony 2,其中SecurityContext
是存储用户和授权的服务。
您需要稍微修改配置,然后$this->getUser()
和$this->denyAccessUnlessGranted()
将为两个防火墙返回/使用相同的User对象。
firewalls:
admin:
pattern: '^/admin'
context: my_app_context
anonymous: true
# ...
main:
anonymous: true
context: my_app_context
# ...
不需要公共提供程序或自定义防护。尽管到处都拥有相同的User
类可能会更容易,或者至少为了清晰起见,通常使用共同的角色。