pages - Spring Security OAuth2, que decide la seguridad?
spring security pages (1)
Necesita un WebSecurityConfigurerAdapter
para asegurar / autorizar el punto final y para proporcionar una forma para que los usuarios se autentiquen. Una aplicación Spring Boot lo haría por usted (agregando su propio WebSecurityConfigurerAdapter
con autenticación básica HTTP). Crea una cadena de filtros con orden = 0 por defecto, y protege todos los recursos a menos que proporcione un emparejador de solicitud. El @EnableResourceServer
hace algo similar, pero la cadena de filtros que agrega está en el orden = 3 de manera predeterminada, por lo que es una alternativa para su propio WebSecurityConfigurerAdapter
en el orden = 0. Su configuración parece sensata (la cadena de inicio de sesión tiene prioridad, pero solo coincide con un pequeño conjunto de solicitudes).
He estado intentando implementar un servidor de autenticación OAuth2 utilizando las guías de Dave Syer con algo de inspiración de JHipster. Pero no puedo entender cómo funciona todo junto.
Parece que la configuración de seguridad que usa el WebSecurityConfigurerAdapter se sobrescribe cuando uso 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();
}
}
Este es un código tomado de algunos ejemplos diferentes, por lo que podrían no mezclarse bien. Pero no puedo encontrar una buena documentación / lista de ejemplos para OAuth2 (a diferencia de Spring Boot, que tiene una documentación impresionante), así que tengo problemas para entender cómo encajan todos. Si no agrego el loginForm al ResourceServerConfigurerAdapter, solo me dará autorización no autorizada. Pero lo definí en WebSecurityConfigurererAdapter como permitAll ().
Este es el 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()");
}
}
¿Algo que estoy haciendo mal? ¿Tengo que configurar toda la seguridad dentro del ResourceServerConfigurerAdapter? ¿Incluso necesito más el WebSecurityConfigurerAdapter?
Si alguien sabe alguna guía, tutorial, blog o cualquier cosa similar que pueda ayudarme a comprender cómo funciona esto, eso sería muy apreciado.
Saludos cordiales, Kenneth.