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.userapp.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:如何在防火墙中为用户/管理员提供多个提供者?的主要内容,如果未能解决你的问题,请参考以下文章

symfony:在多个防火墙中模拟用户

如何在Symfony 4中为测试环境设置数据库

Symfony - 安全/路由设置以启用受密码保护的用户页面

在 Sonata symfony 4 中创建管理员用户

在 Symfony 3 中为集合的每个元素应用特定的验证组

如何分别为每一个定义“记住我”? Symfony 5