2017-03-15 3 views
2

Ich habe eine Spring Boot REST API mit OAuth2 Sicherheit.SpringBoot 1.5.x + Sicherheit + OAuth2

Heute habe ich meine Version spring-boot-starter-parent von 1.4.2 auf 1.5.2 aktualisiert.

Änderungen völlig verwirrt mich.

Vorher konnte ich meine REST API mit Postman testen. Wenn meine Zugriffstoken falsch waren oder ich nicht ein Recht für bestimmte Ressourcen hat, war Server-Antwort wie:

{ 
    "error": "access_denied", 
    "error_description": "Access is denied" 
} 

Jetzt hält es mich ... zu /login Seite umleiten, wenn ich mich einloggen - es ohne meine Ressource zeigen OAuth2 Authentifizierung ...

ich habe versucht, es zu deaktivieren, und ich fand diese magische Eigenschaft:

security.oauth2.resource.filter-order = 3 

Diese Linie gedreht Umleitungen ab Seite einzuloggen.

jedoch meine Fragen sind:

  • was zwischen diesen zwei Versionen in der Bezeichnung der Sicherheit geschehen?
  • ist diese "seltsame" Linie eine einzige gültige Lösung?
  • was ist ein Zweck dieser Login-Seite und welche Authentifizierung es verwendet (Ich überprüft eine Anfragen und Antworten in Google Chrome und ich kann keine Zugriffstoken und oauth2 Zeug, so dass es Benutzer Repository dann nur verwendet?)

Einige wichtiger Teile meines Code:

pom.xml

<!--- .... --> 
<parent> 
    <groupId>org.springframework.boot</groupId> 
    <artifactId>spring-boot-starter-parent</artifactId> 
    <version>1.5.2.RELEASE</version> 
</parent> 
<properties> 
    <!--- .... --> 
    <spring-security-oauth.version>2.1.0.RELEASE</spring-security-oauth.version> 
    <!--- .... --> 
</properties> 
<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-data-jpa</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <!-- Monitor features --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-actuator</artifactId> 
    </dependency> 
    <!-- Security + OAuth2 --> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-security</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.security.oauth</groupId> 
     <artifactId>spring-security-oauth2</artifactId> 
     <version>${spring-security-oauth.version}</version> 
    </dependency> 
<!--- .... --> 

application.properties

#other properties 
security.oauth2.resource.filter-order = 3 

OAuth2.java

public class OAuth2 { 
@EnableAuthorizationServer 
@Configuration 
@ComponentScan 
public static class AuthorizationServer extends AuthorizationServerConfigurerAdapter { 

    @Autowired 
    private AuthenticationManager authenticationManagerBean; 
    @Autowired 
    private UserDetailsService userDetailsService; 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.inMemory() 
       .withClient("trusted_client") 
       .authorizedGrantTypes("password", "refresh_token") 
       .scopes("read", "write"); 
    } 

    @Override 
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
     endpoints.authenticationManager(authenticationManagerBean).userDetailsService(userDetailsService); 
    } 

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { 
     security.allowFormAuthenticationForClients(); 
    } 
} 

@EnableResourceServer 
@Configuration 
@ComponentScan 
public static class ResourceServer extends ResourceServerConfigurerAdapter { 

    @Autowired 
    private RoleHierarchy roleHierarchy; 

    private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() { 
     DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler(); 
     defaultWebSecurityExpressionHandler.setRoleHierarchy(roleHierarchy); 
     return defaultWebSecurityExpressionHandler; 
    } 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
       .authorizeRequests().expressionHandler(webExpressionHandler()) 
       .antMatchers("/api/**").hasRole("DEVELOPER"); 
    } 
} 
} 

Security.java

@EnableWebSecurity 
@Configuration 
@ComponentScan 
public class Security extends WebSecurityConfigurerAdapter { 

@Autowired 
private UserDetailsService userDetailsService; 

@Bean 
public JpaAccountDetailsService userDetailsService(AccountsRepository accountsRepository) { 
    return new JpaAccountDetailsService(accountsRepository); 
} 

@Override 
protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder()); 
} 

@Bean 
@Override 
public AuthenticationManager authenticationManagerBean() throws Exception { 
    return super.authenticationManagerBean(); 
} 

@Bean 
public PasswordEncoder passwordEncoder(){ 
    return new BCryptPasswordEncoder(); 
} 
} 

Antwort

7

Ok, ich habe es jetzt.

@Cleto Gadelha zeigte mir sehr nützliche Informationen.

Allerdings denke ich Release-Note ist ziemlich unklar oder einige Informationen verpassen. Außerdem wird der OAuth2-Ressourcenfilter von 3 auf SecurityProperties.ACCESS_OVERRIDE_ORDER - 1 geändert. Entscheidende Informationen sind, dass der Standard WebSecurityConfigurerAdapter Auftrag 100 (source) ist.

Also, vor Release 1.5.x OAuth2 Resource Server Bestellung war 3, die höher Priorität dann WebSecurityConfigurerAdapter hatte.

Nach Release 1.5.x OAuth2 Ressource-Server, um SecurityProperties.ACCESS_OVERRIDE_ORDER - 1 gesetzt ist (es ist Integer.MAX_VALUE - 8 glaube ich), die nun definitiv niedriger Priorität dann grundlegende WebSecurityConfigurerAdapter Ordnung hat.

Deshalb Login-Seite erscheint für mich, nachdem sie von 1.4.x migrieren

So 1.5.x, eleganter und Java-Stil Lösung @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) auf WebSecurityConfigurerAdapter Klasse

+0

Nizza Untersuchung eingestellt ist. Vielen Dank. –

3

Die Antwort für die erste und die zweite Frage ist bei Spring Boot 1.5 Release Notes:

OAuth 2 Ressourcen Filter

Die Standardreihenfolge der OAuth2 Ressourcenfilter wurde von 3 auf SecurityProperties.ACCESS_OVERRIDE_ORDER geändert - 1. Dies legt es nach den Aktuator Endpunkte, aber vor der Basisauthentifizierungsfilterkette. Der Standardwert kann wiederhergestellt werden, indem security.oauth2.resource festgelegt wird.filter-order = 3

Die Seite/login ist nur ein Pfad, der unautorisierte Benutzer im Frühjahr umleitet. Da Sie keine Custom Login Form verwenden und Ihr Oauth2-Filter in einer falschen Position war, wurde wahrscheinlich eine Basic Auth verwendet.

Verwandte Themen