Como permitir “/ api / **” através da minha configuração de autenticação básica e na minha configuração de oauth no Spring Security

Eu tenho um aplicativo que usa o Basic Auth e o OAuth2.

Alguns URLs são autorizados usando a autenticação básica e “/ api / **” é autorizado usando o OAuth2.

Atualmente, tenho dois arquivos de configuração Java ( WebSecurityConfigurerAdapter e ResourceServerConfigurerAdapter )

Cada um dos arquivos de configuração define um método de public void configure(HttpSecurity http) .

O problema que estou tendo é que preciso de uma maneira elegante de dizer ao meu aplicativo se devo usar a autenticação básica ou oauth2, de acordo com a solicitação de URL.

Atualmente estou usando requestMatchers para que isso aconteça:

 @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')"); } } } 

O problema é que toda vez que eu adiciono um novo URL que NÃO é “/ api / **”, eu preciso adicioná-lo à seção requestMatcher do meu WebSecurityConfig … isso pode levar a erros bobos no futuro.

Existe uma maneira de ter uma pesquisa requestMatcher baseada em um regex lookahead negativo? Eu tentei isso usando o regex: ^(?!/api) mas como ele não retorna um MATCH e só retorna um “find == true”, ele não consegue fazer o trabalho.

Quaisquer pensamentos / sugestões?

Você pode usar NegatedRequestMatcher :

Um RequestMatcher que negará o RequestMatcher transmitido. Por exemplo, se o RequestMatcher transmitido retornar true, NegatedRequestMatcher retornará false. Se o RequestMatcher passou em retornos falsos, NegatedRequestMatcher retornará true.

Você deve usar a anotação Order(...) em classs @Configuration . OAuth2ServerConfig configuração do OAuth2ServerConfig e http.requestMatchers().antMatchers("/api/**") apenas http.requestMatchers().antMatchers("/api/**") e torne seu segundo do @Order(2) ) sem http.requestMatchers() para servir todos os URLs de descanso!

Veja detalhes em https://stackoverflow.com/a/44871933/173149