#java #spring #spring-boot #spring-security #spring-config
#java #spring #spring-загрузка #spring-безопасность #spring-config
Вопрос:
У меня есть две конфигурации:
@Order(1)
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/api/**")
.authorizeRequests()
.anyRequest().hasRole("USER")
.and()
.httpBasic()
.and()
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.exceptionHandling()
.authenticationEntryPoint(new ApiAuthenticationEntryPoint(objectMapper));
}
@Order(2)
http.authorizeRequests()
.antMatchers("/product/**").hasRole(SecurityRoles.USER)
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/authenticateTheUser")
.successHandler(customAuthenticationSuccessHandler)
.permitAll()
.and()
.logout()
.permitAll()
.and()
.exceptionHandling()
.accessDeniedPage("/access-denied");
Мне нужно добавить функциональность для регистрации нового пользователя в конечной точке REST /api/users
без аутентификации. Другие /api/**
конечные точки должны оставаться с базовой аутентификацией. Как это сделать? Я не вижу метода antMatcher
с возможностью выбора типа метода http.
Редактировать:
Мне нужно что-то вроде этого:
http.antMatcher("/api/users", HttpMethod.POST.toString).permitAll()
.and()
.antMatcher("/api/**")
.authorizeRequests()
.anyRequest().hasRole("USER")
(...)
Комментарии:
1. Для
antMatcher
(единственное число) такого метода не существует. Интерфейс намеренно минимален. В JavaDoc говорится , что «Если необходима более продвинутая конфигурация, рассмотрите возможность использованияrequestMatchers()
orrequestMatcher(RequestMatcher)
«.2. Смотрите мою правку. Не могли бы вы показать мне, как это сделать, пожалуйста? Из-за двух конфигураций (REST WWW) у меня проблема с тем, как правильно настроить конечные точки моего API с использованием antMatchers (множественное число). Я мог настроить только все конечные точки API
/api/**
. Но не знаю, как разрешить один конкретный/api/users/
с помощью POST.
Ответ №1:
Вы можете сделать это с помощью antMatchers()
, хотя:
http
.antMatcher("/api/**")
.authorizeRequests()
.antMatchers(HttpMethod.POST, "/api/user").permitAll()
.anyRequest().hasRole("USER")
Разница между antMatcher(..)
и antMatchers(..)
заключается в том, что вы используете antMatcher(..)
, когда у вас есть отдельные классы конфигурации безопасности. Это может быть необходимо, когда вам нужно различать:
- Механизмы аутентификации (форма входа, базовая аутентификация, …)
- Обработка CSRF
- Управление сеансом
- Фильтры
- Службы сведений о пользователе
- …
antMatchers(..)
С другой стороны (внутри authorizeRequests(..)
) используется для различения уровней авторизации (какие роли имеют доступ к определенной конечной точке).
В вашем случае конфигурация подпадает под последнее, поскольку вам нужно различать только полномочия POST /api/user
конечной точки.
Однако, если вам действительно нужен более детальный контроль над тем, какой класс конфигурации безопасности следует применять, то вам следует использовать RequestMatcher
, как указано в комментариях.
Этот интерфейс имеет единственный HttpServletRequest
аргумент и ожидает, что вы вернете boolean
. Поскольку HttpServletRequest
содержит всю необходимую вам информацию, такую как путь и метод HTTP, вы можете правильно настроить, какой класс конфигурации следует применять. Однако в данном случае в этом нет необходимости.