LexikJWTAuthenticationBundle - Как предоставить разный доступ к разным путям? - PullRequest
0 голосов
/ 08 мая 2019

Я использую LexikJWTAuthenticationBundle для аутентификации в моем веб-приложении с использованием REST Webservice.

Я хочу разделить свою заявку на две части:

  • публичный раздел, где каждый может видеть контент - без логина
  • личный раздел, где вы должны войти, чтобы редактировать контент, пользователи

и так далее.

Идея в том, чтобы сделать это через URL:

/api       #reach the public content of the website
/api/admin #reach private admin content, if not logged in -> loginpage

Я пробовал это в security.yaml:

    access_control:
    - { path: ^/api, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api/admin,       roles: IS_AUTHENTICATED_FULLY }

Но когда я пытаюсь загрузить содержимое следующим образом:

curl -X GET <baseurl-backend>/api/content/list #generic example

Я получаю:

{code: 401, message: "JWT Token not found"}

Вот security.yaml со всей конфигурацией:

security:
    encoders:
        App\Entity\User:
            algorithm: argon2i

    providers:
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email

    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        login:
            pattern:  ^/api/login
            stateless: true 
            anonymous: true 
            json_login:
                check_path: /api/login_check #path for checking
                success_handler: lexik_jwt_authentication.handler.authentication_success
                failure_handler: lexik_jwt_authentication.handler.authentication_failure
        api:
            pattern:   ^/api
            stateless: true
            guard:
                authenticators:
                - lexik_jwt_authentication.jwt_token_authenticator
        main: 
            anonymous: true

    access_control:
    - { path: ^/api, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api/admin,       roles: IS_AUTHENTICATED_FULLY }

Спасибо за помощь!

1 Ответ

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

Вы должны добавить anonymous: true к вашему файрволу API.

api:
    pattern:   ^/api
    stateless: true
    anonymous: true
    guard:
        authenticators:
        - lexik_jwt_authentication.jwt_token_authenticator

если вы хотите заблокировать доступ к api/admin, вы должны добавить еще один брандмауэр поверх вашего брандмауэра API:

api_admin:
    pattern:   ^/api/admin
    stateless: true
    guard:
        authenticators:
        - lexik_jwt_authentication.jwt_token_authenticator
api:
    pattern:   ^/api
    stateless: true
    anonymous: true
    guard:
        authenticators:
        - lexik_jwt_authentication.jwt_token_authenticator
...