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.

@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

Luis Sena

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar