Пользователь может войти через веб-форму, а затем клиентский 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
.