https://stackoverflow.com/a/44871933/173149
я есть приложение, которое использует Basic Auth и OAuth2.
Некоторые URL-адреса авторизуются с помощью Basic Auth, а "/ api / **" авторизуется с помощью OAuth2.
В настоящее время у меня есть два файла конфигурации Java (WebSecurityConfigurerAdapter
а такжеResourceServerConfigurerAdapter
)
Каждый из файлов конфигурации определяетpublic void configure(HttpSecurity http)
метод.
Проблема в том, что мне нужен элегантный способ сообщить моему приложению, использовать ли базовую аутентификацию или oauth2 с учетом URL-запроса.
В настоящее время я используюrequestMatchers
чтобы это произошло:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
@Override
protected void configure(HttpSecurity http) throws Exception
{
http
.csrf().disable()
.requestMatchers()
.antMatchers("/*", "/login/**", "/reviews/**")
.and()
.authorizeRequests()
.antMatchers("/*").permitAll()
.antMatchers("/js/**").permitAll()
.antMatchers("/img/**").permitAll()
.formLogin()
.loginPage("/login")
.successHandler(loginSuccessPostHandler)
.permitAll()
.and()
.logout()
.logoutSuccessUrl("/").permitAll()
.and()
.apply(getSpringSocialConfigurer());
}
}
@Configuration
public class OAuth2ServerConfig
{
@Configuration
@EnableResourceServer
protected static class Oauth2ServerConfig extends ResourceServerConfigurerAdapter
{
@Override
public void configure(HttpSecurity http) throws Exception
{
http.httpBasic().disable();
http.csrf().disable();
http.requestMatchers()
.antMatchers("/api/**")
.and()
.authorizeRequests()
.antMatchers("/api/v1/**").access("#oauth2.hasScope('read')");
}
}
}
Проблема в том, что каждый раз, когда я добавляю новый URL, который НЕ "/ api / **", мне нужно будет добавить его в мойWebSecurityConfig
раздел requestMatcher ... это может привести к глупым ошибкам в будущем.
Есть ли способ сделать запрос requestMatcher на основе отрицательного регулярного выражения? Я попробовал это с помощью регулярного выражения:^(?!/api)
но поскольку он на самом деле не возвращает MATCH и возвращает только «find == true», он, похоже, не выполняет свою работу.
Есть мысли / предложения?