Symfony 4:如何在防火墙中为 user/admin 提供多个提供商?

Symfony 4 : How to have multi providers for user/admin in firewall?

我不能使用两种不同的形式为用户和管理员提供两个不同的提供程序

我想为用户和管理员设置两个防火墙。我创建了两个不同的提供者来链接两个不同的实体。我可以以用户身份登录,但不能以管理员身份登录。我不明白我需要添加更多内容。

另外一件事,我知道有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 错误

切换防火墙顺序,因此 main 防火墙是最后一个。

Symfony 每个请求只使用一个防火墙,它是第一个与 pattern 匹配的防火墙。因此,在您的情况下,它也对 ^/backoffice 网址使用 main 防火墙,因为 /backoffice 匹配 ^/ 模式。

我不确定它是否能解决您在这里的所有问题,但您需要这样做才能真正使用 backoffice 防火墙。

关于 app.userapp.admin - 不,没有 app.admin。管理员也是一个用户,所以当您以管理员身份登录时,您将获得其实体 app.user

这是我的更新 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