Я настраиваю HttpSecurity для сервера отдыха Spring Boot, и мне нужно, чтобы конечная точка создания пользователя не требовала аутентификации.
Отображение для метода контроллера - POST /users/{username}?action=create
Я создал следующее регулярное выражение, которое я протестировал с помощью онлайн-инструментов, чтобы убедиться, что оно правильно совпадает:
(/users/)([^/]+)(\?action=create)
Мое единственное правило для имен пользователей заключалось в том, что они не могут содержать /, и поэтому я считаю, что регулярное выражение выполняет это.
Однако, несмотря на добавление в конфигурацию httpsecurity следующего:
.authorizeRequests()
.regexMatchers(HttpMethod.POST,"(\/users\/)([^\/]+)(\\?action=create)")
.permitAll()
Я все еще не могу подключиться к своей конечной точке и не знаю почему.
Спасибо!
ОБНОВИТЬ:
По-видимому, мои пользовательские фильтры будут применяться, если я не настрою объект WebSecurity так, чтобы он полностью игнорировал его, например:
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**")
.and().ignoring().regexMatchers(HttpMethod.POST, "(\/users\/)([^\/]+)(\\?action=create)");
}
Но теперь Spring жалуется на то, что не может найти объект аутентификации ...
@JoeT обязательно POST, объект json, содержащий другие сведения, включен в запрос.
ОК, я видел это "Сопоставление для метода контроллера - GET"
@JoeT Ой, как плохо! Фиксированный
Поскольку регулярное выражение содержится в строке Java, не обязательно ли использовать обратную косую черту? @JoeT




Мое первоначальное решение заключалось в авторизации запросов, которые были аутентифицированы, следующее делает так, что ВСЕ запросы (анонимные или нет) подходят!
Добавьте это в свой собственный WebSecurityConfigurerAdapter
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/v2/api-docs", "/configuration/ui", "/swagger-resources/**", "/configuration/**", "/swagger-ui.html", "/webjars/**")
.and().ignoring().regexMatchers(HttpMethod.POST, "(\/users\/)([^\/]+)(\\?action=create)");
}
И для ясности, это метод контроллера, к которому он применяется:
@RequestMapping(value = "/users/{username}",params = {"action = "+Action.CREATE}, method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public UserModel createUser(@PathVariable(value = "username") String username, @RequestBody UserModel user) {
user.setUsername(username);
return userService.createUser(user);
}
HttpMethod.POST = должно быть HttpMethod.GET?