#spring #spring-boot #spring-mvc #spring-security
#spring #spring-boot #spring-mvc #spring-безопасность
Вопрос:
У меня есть требование, при котором у меня есть контроллер, которому требуется только базовая аутентификация, в то время как другие контроллеры должны проходить аутентификацию через токен на предъявителя. Возможно ли в одном модуле приложения Spring Boot реализовать обе ценные бумаги? Если да, то как я должен определить это в WebSecurityConfigurerAdapter
, filters
, и так далее?
Ответ №1:
Да, это возможно.
По сути, вы бы реализовали два разных WebSecurityConfigurerAdapter
s, каждый из которых настраивает свой собственный HttpSecurity
объект и каждый применяется к различным наборам запросов вашего приложения. Посмотрите на следующий пример конфигурации безопасности:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
private static final RequestMatcher BASIC_REQUESTS = new AntPathRequestMatcher("/api/basic/**");
private static final RequestMatcher BEARER_REQUESTS = new NegatedRequestMatcher(BASIC_REQUESTS);
@Configuration
@Order(1)
public static class BasicAuthSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(BASIC_REQUESTS).authorizeRequests()
.anyRequest().authenticated()
.and()
.httpBasic()
...
}
}
@Configuration
@Order(2)
public static class BearerAuthSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.requestMatcher(BEARER_REQUESTS).authorizeRequests()
.anyRequest().authenticated()
.and()
.addFilter(...)
...
}
}
}
Это говорит Spring обрабатывать все запросы, соответствующие пути /api/basic/**
с базовой схемой аутентификации, и все другие запросы, например, с помощью пользовательской цепочки фильтров, выполняющей некоторую аутентификацию на предъявителя. HttpSecurity.requestMatcher(...)
заставляет Spring применять конфигурацию только для запросов, которые соответствуют заданному сопоставителю запросов.
Обратите внимание, что вам нужно вручную установить порядок для ваших WebSecurityConfigurerAdapter
s, потому что в противном случае Spring попытается инициализировать оба компонента с приоритетом по умолчанию, что приведет к конфликту.