Symfony 4: Как иметь несколько провайдеров для пользователя / администратора в брандмауэре? - PullRequest
0 голосов
/ 16 мая 2019

У меня не может быть двух разных провайдеров для пользователя и администратора с двумя разными формами

Я хочу иметь два брандмауэра, для пользователей и для администраторов. Я создал двух разных провайдеров, связывающих две разные сущности. Я могу войти как пользователь, но не как администратор .. Я не понимаю, что мне нужно, чтобы добавить больше.

Другое дело, я знаю, что есть 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()

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Порядок переключения брандмауэров, поэтому брандмауэр main является последним.

Symfony использует только один брандмауэр на запрос, и он первый соответствует pattern.Так что в вашем случае он использует main брандмауэр для ^/backoffice URL-адресов, потому что /backoffice соответствует шаблону ^/.

Я не уверен, что это решит все ваши проблемы, но вы должны сделать это для того, чтобы действительно использовать backoffice firewall.

Относительно app.user и app.admin- нет, нет app.admin.Администратор тоже пользователь, поэтому, когда вы войдете в систему как администратор, вы получите его сущность с app.user

0 голосов
/ 16 мая 2019

Вот мой обновленный 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
...