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.
Il tuo 'OAuth2ResourceConfig' è ridondante per quanto posso vedere. Sto solo dicendo –
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. –
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