with pages page mvc error baeldung spring spring-security spring-security-oauth2

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.