2017-02-08 2 views
0

Ich habe eine App, die sowohl Basic Auth und OAuth2 verwendet.Wie erlaubt man "/ api/**" durch meine grundlegende Auth-Konfiguration und in meine OAUTH-Konfiguration in Spring Security

Einige URLs sind mit Basic Auth autorisiert und "/ api/**" ist mit OAuth2 autorisiert.

Derzeit habe ich zwei Java-Konfigurationsdateien (WebSecurityConfigurerAdapter und ResourceServerConfigurerAdapter)

Jede der Konfigurationsdateien definieren eine public void configure(HttpSecurity http) Methode.

Das Problem, das ich habe, ist, dass ich eine elegante Möglichkeit brauche, um meiner App zu sagen, ob basic auth oder oauth2 bei der URL-Anfrage verwendet werden soll.

Derzeit requestMatchers ich verwende, damit dies geschieht:

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

Das Problem ist, dass jedes Mal, wenn ich eine neue URL hinzufügen, die nicht zum Thema „/ api/**“, ich werde es hinzufügen müssen in meine WebSecurityConfig 's requestMatcher Sektion ... das könnte in Zukunft zu dummen Fehlern führen.

Gibt es eine Möglichkeit, eine requestMatcher-Suche basierend auf einem negativen Lookahead Regex zu erstellen? Ich habe das mit der Regex: ^(?!/api) versucht, aber da es tatsächlich kein MATCH zurückgibt und nur ein "find == true" zurückgibt, scheint es die Arbeit nicht zu erledigen.

Irgendwelche Gedanken/Vorschläge?

Antwort

2

Sie können NegatedRequestMatcher benutzen.

Ein RequestMatcher, die die RequestMatcher übergeben Zum Beispiel negieren wird, wenn die RequestMatcher in true zurück geführt wird NegatedRequestMatcher false zurück. Wenn der RequestMatcher in false übergeben wurde, gibt NegatedRequestMatcher true zurück.

0

Sie sollten Order(...) Annotation auf @Configuration Klassen verwenden. Machen Sie Ihre OAuth2ServerConfig Konfiguration zuerst und servieren nur http.requestMatchers().antMatchers("/api/**") und machen Sie Ihre WebSecurityConfig Sekunde (@Order(2)) ohne http.requestMatchers(), um alle Rest URLs zu dienen!

Einzelheiten siehe https://stackoverflow.com/a/44871933/173149

Verwandte Themen