2015-02-16 18 views
22

Ho cercato di implementare un server di autenticazione OAuth2 utilizzando le guide di Dave Syer con l'ispirazione di JHipster. Ma non riesco a capire come tutto funzioni insieme.Spring Security OAuth2, che decide la sicurezza?

Sembra che la configurazione di sicurezza che utilizza WebSecurityConfigurerAdapter venga sovrascritta quando utilizzo ResourceServerConfigurerAdapter.

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

Questo è il codice preso da alcuni esempi diversi, quindi potrebbero non mescolare bene. Ma non riesco a trovare una buona documentazione/lista di esempi per OAuth2 (a differenza di Spring Boot che ha una documentazione fantastica), quindi ho problemi a capire come si adattino tutti insieme. Se non aggiungo il loginForm a ResourceServerConfigurerAdapter, semplicemente non mi darà alcuna autorizzazione. Ma l'ho definito in WebSecurityConfigurererAdapter come permitAll().

Questa è l'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()"); 
    } 
} 

Tutto ciò che sto facendo male? Devo impostare tutta la sicurezza all'interno di ResourceServerConfigurerAdapter? Ho persino bisogno di WebSecurityConfigurerAdapter?

Se qualcuno conosce guide, tutorial, blog o qualcosa di simile che potrebbe aiutarmi a capire come funziona, sarebbe molto apprezzato.

Cordiali saluti, Kenneth.

+0

Il tuo 'OAuth2ResourceConfig' è ridondante per quanto posso vedere. Sto solo dicendo –

+0

Quali sono i sintomi (quali percorsi stai colpendo e cosa vedi)? Usando curl (-v per vedere le intestazioni) e la registrazione DEBUG per Spring Security dovrebbe dirti tutto quello che devi sapere. –

+0

I sintomi erano che sostanzialmente ignorava WebSecurityConfigurerAdapter. Ma dopo aver letto la tua spiegazione qui sotto, ho un po 'di più su come funziona. – LG87

risposta

21

È necessario un WebSecurityConfigurerAdapter per proteggere l'endpoint/authorize e per consentire agli utenti di autenticarsi. Un'applicazione Spring Boot lo farebbe per te (aggiungendo il proprio WebSecurityConfigurerAdapter con l'autenticazione di base HTTP). Crea una catena di filtri con ordine = 0 per impostazione predefinita e protegge tutte le risorse a meno che non si fornisca un controllo di richiesta. Lo @EnableResourceServer fa qualcosa di simile, ma la catena di filtri che aggiunge è a ordine = 3 per impostazione predefinita, quindi è un fallback catch-all per il proprio WebSecurityConfigurerAdapter ad ordine = 0. La tua configurazione sembra equilibrata (la catena di login ha la precedenza, ma corrisponde solo a una piccola serie di richieste).

+2

Ho dovuto rendere il mio ordine WebSecurityConfigurerAdapter = 2 per farlo funzionare. –

+0

Specificate l'ordine con l'annotazione dell'ordine o dove specificate questo? Ho lo stesso problema e annotando la configurazione con Order non ha alcun effetto, ResourceServerConfigurerAdapter è l'unica classe utilizzata e WebSecurityConfigurerAdapter viene ignorata completamente. – Cenobyte321

+1

@ Cenobyte321 'implements Ordered' o' @Order (1) 'o' @Order (2) ' – robinhowlett

Problemi correlati