Symfony 4:如何在防火墙中为用户/管理员提供多个提供者?

问题描述 投票:0回答:2

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

我想要有两个防火墙,分别用于用户和管理员。我创建了两个不同的提供者来链接两个不同的实体。我可以以用户身份登录,但不能以管理员身份登录..我不明白我需要添加什么。

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

我致电

null
 时遇到 
$authenticationUtils->getLastAuthenticationError()

错误
symfony firewall symfony-security
2个回答
1
投票

切换防火墙顺序,因此

main
防火墙是最后一个。

Symfony 每个请求仅使用一个防火墙,并且它是第一个与

pattern
匹配的防火墙。因此,在您的情况下,它也对
main
url 使用
^/backoffice
防火墙,因为
/backoffice
匹配
^/
模式。

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

backoffice
防火墙。

关于

app.user
app.admin
- 不,没有
app.admin
。管理员也是一个用户,因此当您以管理员身份登录时,您将获得带有
app.user

的实体

1
投票

这是我更新的 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
© www.soinside.com 2019 - 2024. All rights reserved.