Spring Oauth2 + Spring Security
16/10/2017
0
Estou desenvolvendo uma aplicação que tem uma interface web, e uma camada Rest, essa camada Rest vai usar Oauth2, e o restante, vai se autenticar usando um formulário de login e senha.
O problema, é que a configuração de Security do spring esta sobrescrevendo minhas configurações do ResourceServer, eu consigo autenticar normalmente no AuthorizationServer, mas quando tento acessar alguma url Rest com o token gerado, ele me redireciona para o formulário de login.
Depois de pesquisar muito eu consegui fazer com que não redirecionasse mais para o formulário, mas ele não autentica com o Token, e retorna erro 403.
É possível manter as duas formas de autenticação, e filtrar por url qual vai se autenticar via token, e qual vai se autenticar através do formulário de login?
Segue abaixo minha configuração de segurança.
O problema, é que a configuração de Security do spring esta sobrescrevendo minhas configurações do ResourceServer, eu consigo autenticar normalmente no AuthorizationServer, mas quando tento acessar alguma url Rest com o token gerado, ele me redireciona para o formulário de login.
Depois de pesquisar muito eu consegui fazer com que não redirecionasse mais para o formulário, mas ele não autentica com o Token, e retorna erro 403.
É possível manter as duas formas de autenticação, e filtrar por url qual vai se autenticar via token, e qual vai se autenticar através do formulário de login?
Segue abaixo minha configuração de segurança.
@Configuration @EnableAuthorizationServer @EnableWebSecurity public class OAuth2Config extends AuthorizationServerConfigurerAdapter { private static final String RESOURCE_ID = "resource_id"; @Autowired private CustomUserDetailsService userDetailsService; @Autowired private AuthenticationManager authenticationManager; @Value("${oauth.tokenTimeout:3600}") private int expiration; @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Override public void configure(AuthorizationServerEndpointsConfigurer configurer) throws Exception { configurer.authenticationManager(authenticationManager); configurer.userDetailsService(userDetailsService); } @Override public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { oauthServer.allowFormAuthenticationForClients(); // Disable /oauth/token Http Basic Auth oauthServer.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()"); } @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients .inMemory() .withClient("client_id") .authorizedGrantTypes("password", "refresh_token") .authorities("ADMIN") .scopes("read", "write") .resourceIds(RESOURCE_ID) .secret("senha") .accessTokenValiditySeconds(expiration); } } @Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ @Configuration @Order(1) public static class ApiWebSecurityConfig extends WebSecurityConfigurerAdapter{ @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .antMatcher("/api/**") .authorizeRequests() .anyRequest().hasAnyRole("ADMIN", "USER", "AGENTE") .antMatchers("/api/**").fullyAuthenticated() .and() .httpBasic().disable(); } } @Configuration @Order(2) public static class FormWebSecurityConfig extends WebSecurityConfigurerAdapter{ @Override @Bean public AuthenticationManager authenticationManagerBean() throws Exception { return super.authenticationManagerBean(); } @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/static/**"); web.ignoring().antMatchers("/webjars/**"); web.ignoring().antMatchers("/upload/**"); } @Override protected void configure(HttpSecurity http) throws Exception { //Permissões http .authorizeRequests() .antMatchers("/usuario/**").hasRole("ADMIN") .antMatchers("/relatorio/**").hasAnyRole("ADMIN","USER") .anyRequest().authenticated(); //Login http.formLogin() .loginPage("/login") .permitAll() .defaultSuccessUrl("/", false) .failureUrl("/error-login") .usernameParameter("login") .passwordParameter("password"); //Logout http.logout() .logoutRequestMatcher(new AntPathRequestMatcher("/logout")) .logoutSuccessUrl("/login") .permitAll(); //Remenber-me http.rememberMe() .tokenValiditySeconds(1209600); } } } @EnableResourceServer @Configuration public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter{ private static final String RESOURCE_ID = "floricultura-service"; @Autowired private JsonToUrlEncodedAuthenticationFilter jsonFilter; @Override public void configure(ResourceServerSecurityConfigurer resources) { resources.resourceId(RESOURCE_ID).stateless(false); } @Override public void configure(HttpSecurity http) throws Exception { http.addFilterBefore(jsonFilter, ChannelProcessingFilter.class) .requestMatchers().antMatchers("/api/**") .and().authorizeRequests().anyRequest().authenticated(); http.headers().contentTypeOptions().disable(); } }
Luis Sena
Curtir tópico
+ 0
Responder
Clique aqui para fazer login e interagir na Comunidade :)