Spring-boot-oauth2-angularjs,会话到期后CORS错误并重定向到oauth2服务器

时间:2016-04-04 11:41:09

标签: angularjs ajax spring spring-mvc oauth

我有一个前端应用程序,它使用服务器端的Spring-boot,Spring security oauth2和客户端的AngularJs。我还使用第三方oauth2服务器。我的问题是,在应用程序会话到期后,sping-security会将所有请求重定向到' / login' (并且确切地说它应该如何)并且我获得了302状态代码,其位置在响应头中的auth-server页面上重定向。但重定向不会发生,因为我收到错误:

  

XMLHttpRequest无法加载****:// bla-bla / oauth / authorize?client_id = ... andSomeAuthStuff。 No' Access-Control-Allow-Origin'标头出现在请求的资源上。起源' ****:// myipadress:8084'因此不允许访问。

问题是为什么第一次进入应用程序或刷新页面或注销和新登录时不会出现这样的错误并且一切顺利但只有当我得到会话超时时(例如我从死视图中发出ajax请求) ),发生CORS错误: - (

我重现了以下步骤:

  1. 关于"死"页面我向我的API发出ajax请求(在提供的Tomcat 8上运行的Spring-boot 1.3.3 WAR)
  2. Spring拦截请求并回复:
  3. 常规

      

    请求网址:*** // myipadress:8084 / appname / login

         

    请求方法:GET

         

    状态代码:302找到

         

    远程地址:myipadress:8084

    回复标题:

      

    Access-Control-Allow-Headers:授权,内容类型,接受,x-requested-with,Cache-Control

         

    Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE,PUT

         

    访问控制允许来源:*

         

    访问控制 - 最大值 - 年龄:3600

         

    缓存控制:无缓存,无存储,最大年龄= 0,必须重新验证

         

    位置:* // authserver / OAuth的/授权的client_id = ******&安培; REDIRECT_URI = *:// myipadress:8084 /应用程序的名字/登录&安培; RESPONSE_TYPE =代码&安培;状态= BIQ68y

         

    杂注:无缓存

         

    服务器:Apache-狼/ 1.1

         

    设置Cookie:JSESSIONID = 05D39263EEF7EC9E24AEE8E1E6693748;路径= /应用程序的名字/;仅Http

         

    X-的Content-Type-选项:nosniff

         

    X框-选项:DENY

         

    X-XSS-保护:1;模式=块

    CORS过滤器:

    public class SimpleCORSFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletResponse res = (HttpServletResponse) response;
            res.setHeader("Access-Control-Allow-Origin", "*");
            res.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT");
            res.setHeader("Access-Control-Max-Age", "3600");
            res.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, Accept, x-requested-with, Cache-Control");
            chain.doFilter(request, res);
        }
    
        @Override
        public void destroy() {
        }
    }
    

    安全配置:

    @EnableOAuth2Sso
    @Configuration
    public class CustomWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    
        @Override
        public void configure(HttpSecurity http) throws Exception {
            http.logout()
                    .and().antMatcher("/**")
                    .authorizeRequests()
                    .anyRequest().authenticated()
                    .and().csrf().disable()
                    .addFilterBefore(new SimpleCORSFilter(), ChannelProcessingFilter.class);
        }
    
    }
    

    在ajax请求后记录:

      

    2016-04-04 14:10:42.613 DEBUG 5428 --- [o-8084-exec-144] o.s.s.w.u.matcher.AntPathRequestMatcher:检查请求的匹配:' / login&#39 ;;反对' / login'   2016-04-04 14:10:42.613 DEBUG 5428 --- [o-8084-exec-144] uth2ClientAuthenticationProcessingFilter:请求是处理身份验证   2016-04-04 14:10:42.615 DEBUG 5428 --- [o-8084-exec-144] w.c.HttpSessionSecurityContextRepository:SecurityContext为空或内容为匿名 - 上下文不会存储在HttpSession中。   2016-04-04 14:10:42.657 DEBUG 5428 --- [o-8084-exec-144] s.s.w.c.SecurityContextPersistenceFilter:SecurityContextHolder现已清除,请求处理完成   2016-04-04 14:10:42.658 DEBUG 5428 --- [o-8084-exec-144] ossweb.DefaultRedirectStrategy:重定向到' ****:// authserver / oauth / authorize?client_id = *****&安培; REDIRECT_URI = ***:// myipadress:8084 /应用程序的名字/登录&安培; RESPONSE_TYPE =代码&安培;状态= iNdnBk'

3 个答案:

答案 0 :(得分:0)

我相信你需要将@EnableWebSecurity注释添加到CustomWebSecurityConfigurerAdapter。

答案 1 :(得分:0)

另外,我试图采用另一种方式并以这种方式放置过滤器:

 @Override
    public void configure(HttpSecurity http) throws Exception {
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true); 
        config.addAllowedOrigin("*");
        config.addAllowedHeader("*");
        config.addAllowedMethod("GET");
        config.addAllowedMethod("PUT");
        source.registerCorsConfiguration("/**", config);
        CorsFilter filter = new CorsFilter(source);

        http
                .logout()
                .and().antMatcher("/**")
                .authorizeRequests()
                .anyRequest().authenticated()
                .and().csrf().disable()
                .addFilterBefore(filter, ChannelProcessingFilter.class);
    }

但它也没有帮助,CORS标题响应全部消失了!

答案 2 :(得分:0)

我认为原因不是在标题中,而是在状态码302中作为响应。我怎么来401而不是302?