Сопоставитель HttpSecurity Regex не работает должным образом

Я настраиваю 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 жалуется на то, что не может найти объект аутентификации ...

HttpMethod.POST = должно быть HttpMethod.GET?

Joe T 22.04.2018 00:30

@JoeT обязательно POST, объект json, содержащий другие сведения, включен в запрос.

Jordan Mackie 22.04.2018 00:34

ОК, я видел это "Сопоставление для метода контроллера - GET"

Joe T 22.04.2018 00:35

@JoeT Ой, как плохо! Фиксированный

Jordan Mackie 22.04.2018 00:35

Поскольку регулярное выражение содержится в строке Java, не обязательно ли использовать обратную косую черту? @JoeT

Jordan Mackie 22.04.2018 12:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
1 752
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Мое первоначальное решение заключалось в авторизации запросов, которые были аутентифицированы, следующее делает так, что ВСЕ запросы (анонимные или нет) подходят!

Добавьте это в свой собственный 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);

}

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