Ответ JSON Symfony Security Firewall - PullRequest
0 голосов
/ 09 июля 2019

Пользователь может войти через веб-форму, а затем клиентский JavaScript будет использоваться для доступа к API.Если пользователь не вошел в API, должен вернуть json-ответ с ошибкой 403, любая другая страница на сайте должна продолжать перенаправлять на страницу входа.

Существуют следующие брандмауэры:

firewalls:   
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            csrf_token_generator: security.csrf.token_manager
        logout:       true
        anonymous:    true
access_control:
    - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/api/, role: ROLE_USER }

Форма входа работает правильно, и / api / маршруты безопасны.

Если клиент javascript когда-либо обращается к / api / * и пользователь не вошел в систему, он должен получить ответ 403 json,в настоящее время они получают перенаправление 302 на страницу / логин.Возможно, пользователь не вошел в систему, потому что сеанс мог истечь.

Как вы возвращаете ответ JSON, когда пользователь не вошел в систему только для / api / маршруты?

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

App\EventListener\SecurityListener:
    tags:
        - { name: kernel.event_listener, event: security.authentication.failure, method: onFailure }

Я мог бы также проверить в каждом методе контроллера для ! isGranted(ROLE_USER) и вернуть JsonResponse(message: "please login", status: 403), но это не очень оптимально и приводит к большому количеству дублированного кода,должно быть более простое решение.

Клиент javascript всегда будет отправлять заголовки Content-Type: application/json.

1 Ответ

0 голосов
/ 09 июля 2019

Вы можете создать собственный обработчик и аутентификатор:

form_login:
    csrf_token_generator: security.csrf.token_manager
    provider:             fos_userbundle
    login_path:           /login
    check_path:           /login_check
    success_handler:      'your_custom_login_success_handler'
    failure_handler:      'your_custom_login_failure_handler'
    guard:
        authenticators:
            - App\Security\TokenAuthenticator
...