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

时间:2019-05-16 10:46:20

标签: symfony symfony-security symfony-4.2

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

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

另一件事,我知道有app.user。但是还有app.admin吗?为了在两个不同的防火墙上拥有两个完全独立的帐户?

read_csv

致电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错误

2 个答案:

答案 0 :(得分:1)

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

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

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

关于app.userapp.admin-不,没有app.admin。管理员也是用户,因此当您以管理员身份登录时,您将使用app.user

获取其实体

答案 1 :(得分:0)

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