使用AngularJS的Spring Boot和CSRF - Forbitten 403 - >错误注销

时间:2016-10-25 08:37:56

标签: angularjs spring-boot csrf csrf-protection

在我的Spring Boot / AngularJS应用程序中,我有以下CSRF配置:

@Override
protected void configure(final HttpSecurity http) throws Exception {
    http.csrf().csrfTokenRepository(csrfTokenRepository());    http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

    final String[] restEndpointsToSecure = WebSecurityConfig.restEndpointsToSecure;
    for (final String endpoint : restEndpointsToSecure) {
        http.authorizeRequests().antMatchers("/" + endpoint + "/**").hasRole(UserRoleEnum.USER.toString());
    }

    http.addFilterAfter(csrfTokenResponseHeaderBindingFilter(), CsrfFilter.class);

    xAuthTokenConfigurer.setDetailsService(userDetailsServiceBean());
    final SecurityConfigurer<DefaultSecurityFilterChain, HttpSecurity> securityConfigurerAdapter = xAuthTokenConfigurer;
    http.apply(securityConfigurerAdapter);
}

CSRF-令牌过滤器如下所示:

@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, javax.servlet.FilterChain filterChain)
        throws ServletException, IOException {

    final CsrfToken csrf = (CsrfToken)request.getAttribute(CsrfToken.class.getName());
    if (csrf != null) {
        Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN");
        final String token = csrf.getToken();
        if (cookie == null || token != null && !token.equals(cookie.getValue())) {
            cookie = new Cookie("XSRF-TOKEN", token);
            cookie.setPath("/");
            response.addCookie(cookie);
        }
    }
    filterChain.doFilter(request, response);
}

通常它工作正常,请求头属性X-XSRF-TOKEN随每个请求一起发送。但我有一个奇怪的行为。 我将在应用程序中更新我的用户配置文件。它第一次工作正常,第二次,我得到一个HTTP 403 Forbidden,实际上我真的不知道为什么。 我在这两个更新之间没有做任何事情(没有导航到这两个更新之间的其他页面或其他内容)。

在底部的图片中,左边的Request是有效的,右边是failes。唯一不同的是,在右侧,响应标头中缺少 Set-Cookie X-Application-context 属性。请求标头相同。

有谁知道我在这里做错了什么。这对我来说是神秘主义者。

enter image description here

1 个答案:

答案 0 :(得分:0)

好像error userProfile.controller

中似乎有一些功能front-end
  

请求标题重定向的 Cookie SessionID 响应标头中变得相同,从而导致 INVALID_SESSIONID 因此,用户重定向登录页面注册页面

作为此解决方案,您可以更正您的前端控制器,或者作为另一种解决方法,您可以将以下内容添加到您的代码中

  • 仅在检测到CORS时添加CORS标头并传递原始标头,以便允许访问用户内容。
  • 使用http 200消息回复OPTIONS请求

     static final String ORIGIN = "Origin";
    
    if (request.getHeader(ORIGIN).equals("null")) {
            String origin = request.getHeader(ORIGIN);
            response.setHeader("Access-Control-Allow-Origin", "*");//* or origin as u prefer
            response.setHeader("Access-Control-Allow-Credentials", "true");
           response.setHeader("Access-Control-Allow-Headers",
                    request.getHeader("Access-Control-Request-Headers"));
        }
        if (request.getMethod().equals("OPTIONS")) {
            try {
                response.getWriter().print("OK");
                response.getWriter().flush();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    

    然后添加要调用的自定义过滤器

          //your other configs
          < security:custom-filter ref="corsHandler" after="PRE_AUTH_FILTER"/>
    

thread

完全归因于此author答案