У меня проблемы с Spring Security и некоторыми URL-адресами.
Это сценарий: Spring Boot 2.1.0 Spring Security 5.1.1
Я использую стандартную конфигурацию безопасности слогин и тому подобное.У меня также есть некоторые роли и разрешения с PreAuthorize
в RequestMapping
из Controller
.Здесь нет проблем.Все работает отлично.
Проблема обнаруживается с некоторыми сопоставлениями.Я покажу вам пример:
@RequestMapping(value = "/codigo/{barcode}.pdf")
@ResponseBody
@PreAuthorize("hasAnyRole({'ROLE_ADMIN','ROLE_USER'})")
public void codigo(HttpServletRequest request, HttpServletResponse response, @PathVariable(required = true, name = "barcode") String barcode) {
...
}
Этот URL возвращает отчет в формате PDF, а не HTML-страницу.
Я получаю это сообщение об ошибке:
AuthenticationCredentialsNotFoundException: An Authentication object was not found in the Security Context
Если я добавлю какой-нибудь код для проверки контекста безопасности
SecurityContext ctx = SecurityContextHolder.getContext();
Logger.getLogger(InformesController.class.getName()).log(Level.WARNING, "Context: {0}", ctx);
, то получу следующее:
2018-12-03 10:11:19.104 WARN 11356 --- [io-8081-exec-10] c.g.e.controller.InformesController : Context: org.springframework.security.core.context.SecurityContextImpl@ffffffff: Null authentication
Я пробовал разные комбинации, чтобы получить одну работающую.Это результат:
@ RequestMapping (value = "/codigo/ndombarcode enj.pdf"): нулевая аутентификация
@ RequestMapping (value = "/ codigo / {barcode} "): Если {штрих-код} равен'thing.pdf '(или .txt или какому-либо другому расширению) -> Нулевая аутентификация
@ RequestMapping (value =" / codigo / {barcode} "): если{штрих-код} - это что-то, все работает нормально.
Я проверил это в Firefox и Chrome, чтобы убедиться, что это не проблема браузера, и получил те же результаты.
В качестве обходного пути я использую подход без расширения, поскольку он работает, но я хотел бы знать, есть ли способ избежать этого или узнать, почему это происходит.