Symfony如何拥有多个登录用户

时间:2019-04-01 08:11:21

标签: symfony authentication

我正在用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。但这不起作用。

谢谢。

1 个答案:

答案 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类可能会更容易,或者至少为了清晰起见,通常使用共同的角色。