2015-02-16 11 views
22

Ich habe versucht, einen OAuth2-Authentifizierungsserver mit den Leitern von Dave Syer zu implementieren, der von JHipster inspiriert wurde. Aber ich kann nicht herausfinden, wie alles zusammen funktioniert.Spring Security OAuth2, die Sicherheit entscheidet?

Es sieht so aus, als ob die Sicherheitskonfiguration mit dem WebSecurityConfiguratorAdapter überschrieben wird, wenn ich ResourceServerConfigurerAdapter verwende.

@Configuration 
@EnableResourceServer 
public class OAuth2ResourceConfig extends ResourceServerConfigurerAdapter { 

    private TokenExtractor tokenExtractor = new BearerTokenExtractor(); 

    @Override 
    public void configure(HttpSecurity http) throws Exception { 
     http 
       .addFilterAfter(contextClearer(), AbstractPreAuthenticatedProcessingFilter.class) 
       .authorizeRequests() 
       .anyRequest().authenticated().and().httpBasic(); 
    } 

    private OncePerRequestFilter contextClearer() { 
     return new OncePerRequestFilter() { 
      @Override 
      protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 
       if (tokenExtractor.extract(request) == null) { 
        SecurityContextHolder.clearContext(); 
       } 
       filterChain.doFilter(request, response); 
      } 
     }; 
    } 

@Component 
public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter { 

    private final AuthenticationManager authenticationManager; 

    @Autowired 
    public CustomWebSecurityConfigurerAdapter(AuthenticationManager authenticationManager) { 
     this.authenticationManager = authenticationManager; 
    } 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
       .parentAuthenticationManager(authenticationManager); 
    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
     http 
       .formLogin() 
        .loginPage("/login").permitAll() 
       .and() 
        .authorizeRequests().antMatchers(HttpMethod.OPTIONS, "/**").permitAll() 
       .and() 
        .requestMatchers().antMatchers("/login", "/oauth/authorize", "/oauth/confirm_access") 
       .and() 
        .authorizeRequests().anyRequest().authenticated(); 
    } 
} 

Dies ist Code aus ein paar verschiedenen Beispielen, so dass sie nicht so gut mischen können. Aber ich kann keine gute Dokumentations-/Beispielliste für OAuth2 finden (anders als Spring Boot, die eine großartige Dokumentation hat), so dass ich Probleme habe zu verstehen, wie alles zusammenpasst. Wenn ich das LoginForm nicht dem ResourceServerConfigurerAdapter hinzufüge, wird es mich nur nicht autorisiert. Aber ich habe es im WebSecurityConfigurerAdapter als permitAll() definiert.

Dies ist AuthorizationServerConfigurerAdapter:

@Configuration 
@EnableAuthorizationServer 
public class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter { 

    @Autowired 
    private AuthenticationManager authenticationManager; 

    @Autowired 
    private JwtAccessTokenConverter jwtAccessTokenConverter; 

    @Override 
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
     clients.inMemory() 
       .withClient("acme") 
       .secret("acmesecret") 
       .authorizedGrantTypes("authorization_code", "refresh_token", 
         "password").scopes("openid"); 
    } 

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

    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
     oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()"); 
    } 
} 

Alles, was ich falsch mache? Muss ich die gesamte Sicherheit im ResourceServerConfigurerAdapter einrichten? Brauche ich den WebSecurityConfigurerAdapter noch?

Wenn jemand irgendwelche Anleitungen, Tutorials, Blogs oder ähnliches kennt, die mir helfen könnten, meinen Kopf darüber zu wickeln, wie das funktioniert, wäre das sehr zu schätzen.

Mit freundlichen Grüßen, Kenneth.

+0

Ihre 'OAuth2ResourceConfig' ist so weit redundant, wie ich sehen kann. Sag es einfach. –

+0

Was sind die Symptome (welche Wege schlagen Sie und was sehen Sie)? Die Verwendung von curl (-v, um die Header anzuzeigen) und die DEBUG-Protokollierung für Spring Security sollten Ihnen alles sagen, was Sie wissen müssen. –

+0

Die Symptome waren, dass es den WebSecurityConfigurerAdapter grundsätzlich ignorierte. Aber nachdem ich Ihnen die Erklärung unten gelesen habe, bekomme ich ein bisschen mehr, wie es funktioniert. – LG87

Antwort

21

Sie benötigen eine WebSecurityConfigurerAdapter, um den Endpunkt/authorize zu sichern und Benutzern eine Möglichkeit zur Authentifizierung zu bieten. Eine Spring-Boot-Anwendung würde das für Sie erledigen (indem Sie eine eigene WebSecurityConfigurerAdapter mit HTTP-Basisauthentifizierung hinzufügen). Es erstellt standardmäßig eine Filterkette mit der Reihenfolge "0" und schützt alle Ressourcen, es sei denn, Sie stellen einen Anforderungsmatcher bereit. Das @EnableResourceServer tut etwas ähnliches, aber die Filterkette, die es hinzufügt, ist bei Auftrag = 3 standardmäßig, so ist es ein Catch-All Fallback für Ihr eigenes WebSecurityConfigurerAdapter bei Auftrag = 0. Ihre Konfiguration sieht normal aus (die Login-Kette hat Vorrang, entspricht jedoch nur einer kleinen Anzahl von Anfragen).

+2

Ich musste meinen WebSecurityConfigurerAdapter Auftrag = 2 machen, um es zum Funktionieren zu bringen. –

+0

Geben Sie die Reihenfolge mit der Auftragsannotation an oder wo geben Sie diese an? Ich habe das gleiche Problem und kommentieren die Konfiguration mit Order hat keine Wirkung, ResourceServerConfiguratorAdapter ist die einzige Klasse verwendet und WebSecurityConfigurerAdapter wird vollständig ignoriert. – Cenobyte321

+1

@ Cenobyte321 'implementiert Ordered' oder' @Order (1) 'oder' @Order (2) ' – robinhowlett

Verwandte Themen