首页 > 解决方案 > Symfony 4:如何在防火墙中为用户/管理员提供多个提供者?

问题描述

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

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

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

标签: symfonysymfony-securitysymfony-4.2

解决方案


切换防火墙顺序,所以main防火墙是最后一个。

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

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

关于app.userand app.admin- 不,没有app.admin. 管理员也是一个用户,所以当你以管理员身份登录时,你会得到它的实体app.user


推荐阅读