Использование @PreAuthorize в методе, возвращающем SseEmitter, возвращает HTTP 406

Я использую jwt для аутентификации, подозреваю, что это как-то связано с заголовком запроса, в котором есть токен.

Получение события, отправленного сервером, без добавления @PreAuthorize работает нормально:

@GetMapping("/sse")
public SseEmitter serverSentEvent() throws IOException
{
   SseEmitter emitter = new SseEmitter(2592000000L);
   emitter.send("OK");

   return emitter;
}

Но когда я добавляю @PreAuthorize для проверки роли использования, я получаю ответ 406 (не могу установить соединение с сервером в http: // локальный: 8080 / sse)

@GetMapping("/sse")
@PreAuthorize("hasRole('ADMIN')")
public SseEmitter serverSentEvent() throws IOException
{
   SseEmitter emitter = new SseEmitter(2592000000L);
   emitter.send("OK");

   return emitter;
}

Есть ли в вашем запросе заголовок Accept?

Makoto 20.12.2018 18:14

Я не устанавливал заголовок Accept, только заголовок авторизации с токеном.

Muizz Mahdy 20.12.2018 18:27

HTTP 406 является «неприемлемым», поэтому намек может заключаться в том, что вам требуется заголовок принятия. Также может случиться так, что ваша конечная точка также должна принимать некоторый MIME-тип (например, application/json или что-то более подходящее).

Makoto 20.12.2018 18:29

Я использую EventSource на клиенте, который отправляет запрос GET на URL-адрес с заголовком принятия text/event-stream

Muizz Mahdy 20.12.2018 18:38
1
4
410
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Очевидно, перехватчик JWT не добавлял токен в заголовок авторизации для запросов EventSource, поэтому я использовал ng-событие-источник, который позволяет настраивать заголовки HTTP в EventSource.

Другие вопросы по теме