Я хочу проверить разные методы аутентификации для разных конечных точек. Я хочу использовать методы x509 и jwt. Мне нужно использовать Только x509 для определенной конечной точки и использовать JWT для всех остальных запросов.
Вот моя конфигурация веб-безопасности:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Configuration
@Order(1)
public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/api/transaction/testf").authenticated().and()
.x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(new X509UserDetailsService())
;
}
}
@Configuration
@Order(2)
public static class ApiTokenSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/oauth/token", "/api/dealer/login").permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
;
}
}
}
Эта конфигурация проверяет только конечную точку /API/транзакция/тестф на наличие сертификата x509 и позволяет всем остальным конечным точкам отвечать. Мне нужно, чтобы другие конечные точки возвращали 503 без токена jwt.
У вас есть две цепочки фильтров. Ни у одного из них нет правильно настроенного паттерна точки входа http.antMatcher. Это означает, что они настроены на использование /** в качестве шаблона точки входа.
Например
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().fullyAuthenticated()
это то же самое, что сказать:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.anyRequest().fullyAuthenticated()
То, что мы говорим здесь,
http - цепочка фильтров безопасностиhttp.antMatcher - точка входа в цепочку фильтров безопасностиhttp.authorizeRequests - начало ограничения доступа к моей конечной точкеhttp.authorizeRequests.antMatchers - список URL-адресов с определенным доступомИтак, что вам нужно сделать, это изменить цепочку фильтров @Order(1), чтобы сузить шаблон. Например: http.antMatcher("/api/transaction/**")
Теперь ваша конфигурация будет выглядеть
@Configuration
@Order(1)
public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/api/transaction/**") //customized entry point
.authorizeRequests()
.antMatchers("/api/transaction/testf").authenticated().and()
.x509()
.subjectPrincipalRegex("CN=(.*?)(?:,|$)")
.userDetailsService(new X509UserDetailsService())
;
}
}
@Configuration
@Order(2)
public static class ApiTokenSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**") //this is default
.authorizeRequests()
.antMatchers("/oauth/token", "/api/dealer/login").permitAll()
.and()
.authorizeRequests()
.anyRequest()
.authenticated()
;
}
С вашей существующей конфигурацией цепочка фильтров с именем ApiWebSecurityConfig будет перехватывать все вызовы. Другая цепочка фильтров, ApiTokenSecurityConfig, никогда не используется.
Вы можете увидеть другое описание в этом отвечать
Для каждой цепочки фильтров необходимо указать шаблон муравья для этой цепочки.
http.antMatcher(не http.authorizeRequests как первый вызов) Этот пост описывает, что вам нужно: stackoverflow.com/questions/54657163/…