多个Web安全性导致ERR_TOO_MANY_REDIRECTS

时间:2016-03-04 20:01:07

标签: spring-security jwt spring-social-google

我尝试通过Java Config配置Spring Security,以便在我的应用上处理两种身份验证:基于表单(用户登录)和基于令牌(REST api)。

表单配置是直截了当的,除了我必须创建自己的SecuritySocialConfigurer的部分(基本上是SpringSocialConfigurer的副本,带有自定义身份验证成功处理程序,生成JWT令牌并设置一个cookie它在回应中。)

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    super.configure(auth);
    auth
        .userDetailsService(userDetailsService())
        .passwordEncoder(NoOpPasswordEncoder.getInstance());
}

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**", "/img/**");
}

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .formLogin()
            .loginPage("/signin")
            .loginProcessingUrl("/signin/authenticate")
            .failureUrl("/signin?param.error=bad_credentials")
        .and()
            .logout()
                .logoutUrl("/signout")
                .deleteCookies("JSESSIONID")
        .and()
            .authorizeRequests()
                .antMatchers("/admin/**", "favicon.ico", "/public/**", "/auth/**", "/signin/**").permitAll()
                .antMatchers("/**").hasRole("USER")
        .and()
            .rememberMe()
        .and()
            .apply(new MilesSocialSecurityConfigurer());
}

当只有此配置正在播放时,我可以访问http://localhost:8080并重定向到http://localhost:8080/signin以执行登录。成功登录后,我检查是否存在JWT令牌cookie。

第二个安全配置的目的是在调用REST api时检查是否存在JWT令牌。

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .addFilterAfter(jwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
        .antMatcher("/api/**")
            .csrf()
                .disable()
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
        .and()
            .exceptionHandling()
                .authenticationEntryPoint(restAuthenticationEntryPoint)
        .and()
            .authorizeRequests()
                .antMatchers("favicon.ico", "/public/**", "/auth/**", "/signin/**").permitAll()
                .antMatchers("/**").authenticated()
        ;
}

@Bean
public JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
    JwtAuthenticationFilter filter = new JwtAuthenticationFilter("/api/**");
    filter.setAuthenticationSuccessHandler(jwtAuthenticationSuccessHandler);
    filter.setAuthenticationManager(apiAuthenticationManager());
    return filter;
}

@Bean
public ProviderManager apiAuthenticationManager() {
    return new ProviderManager(Arrays.asList(jwtAuthenticationProvider));
}

JwtAuthenticationProvider是一个解析JWT令牌并生成UserDetails对象的类,如果令牌不存在或无效,则会抛出AuthenticationException

当第二个配置到位后,我无法导航到http://localhost:8080(或/signin)以启动登录进程 - 浏览器会返回ERR_TOO_MANY_REDIRECTS。

我尝试了一些没有成功的事情。任何有关正在发生的事情的线索都将非常感激。

感谢。

1 个答案:

答案 0 :(得分:0)

更改

.antMatchers("/**").authenticated()

 .anyRequest().authenticated()

这意味着任何与您明确定义的URL不匹配的URL都需要进行身份验证。