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