CSRF - 仅在第一次登录

时间:2015-08-11 16:30:51

标签: java angularjs spring spring-security csrf

当我在服务器上部署我的应用程序时,我第一次可以毫无问题地登录。但是当我退出时,我得到了#403; 403 Forbidden"在退出邮件请求。然后我无法成功登录,因为我在登录请求中收到403错误。 按Ctrl + F5,尝试再次登录...它可以工作,但只有一次。

    @Override
    protected void configure(HttpSecurity http) throws Exception {
http
                .authorizeRequests()
                .antMatchers("/apps", "/sites", "/users").authenticated()
                .and()
                .csrf()
                .csrfTokenRepository(csrfTokenRepository())
                .and()
                .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class);
}
private CsrfTokenRepository csrfTokenRepository() {
    HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository();
    repository.setHeaderName("X-XSRF-TOKEN");
    return repository;
}

和CsrfHeaderFilter类:

public class CsrfHeaderFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        CsrfToken token = (CsrfToken) request.getAttribute(CsrfToken.class
                .getName());
        response.setHeader("X-CSRF-HEADER", token.getHeaderName());

        response.setHeader("X-CSRF-PARAM", token.getParameterName());

        response.setHeader("X-XSRF-TOKEN", token.getToken());

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

和Angular:

$httpProvider.defaults.xsrfHeaderName = 'X-XSRF-TOKEN';

我的应用程序部署在localhost:8080 / myApp,如果重要的话。

1 个答案:

答案 0 :(得分:1)

loginlogout等特定事件发生后,CSRF令牌会发生变化。因此,下一个POST请求将失败,如您的情况。我遇到了同样的问题,经过一些诊断后发现,在loginlogout等之后发送另一个GET请求将是解决问题的最佳方法。 (如果您不使用CORS,也可以loginlogout发送重定向响应)。有关详细信息,请参阅this stackoverflow post

相关问题