启用 Spring Security CSRF 的 Sockjs 回退

Posted

技术标签:

【中文标题】启用 Spring Security CSRF 的 Sockjs 回退【英文标题】:Sockjs fallback with Spring Security CSRF enable 【发布时间】:2015-12-05 11:45:57 【问题描述】:

我的项目使用 Spring Security + Spring MVC 并处理 websocket(通过 stomp+sockjs)。 当我测试 sockjs 回退时,XHR 请求返回 403。 如果我在安全上下文中关闭 csrf 就可以了。 如果我像这样覆盖 sockjs AbstractXHRObject 构造函数:没关系:

function AbstractXHRObject(method, url, payload, opts) 
  debug(method, url);
  var self = this;
  EventEmitter.call(this);

  // HACK : add csrf headers
  opts["headers"][csrfHeader] = csrfToken;

  setTimeout(function () 
    self._start(method, url, payload, opts);
  , 0);

当然,我必须检查 opts 是否不为空...

我的问题是:在 SockJS 的 XHR 后备对象上添加标头的方法是什么

谢谢

【问题讨论】:

不知道 sockjs 在 angularjs 的情况下你可以添加拦截和添加这样的标题***.com/questions/27332717/… 【参考方案1】:

最后,我在我的安全上下文中禁用了 sockjs URL 的 CSRF。

 <security:csrf request-matcher-ref="csrfMatcher" />

和匹配器:

public class CsrfSecurityRequestMatcher implements RequestMatcher 

    private Pattern                 allowedMethods      = Pattern.compile("^(GET|HEAD|TRACE|OPTIONS)$");
    private AntPathRequestMatcher   unprotectedMatcher  = new AntPathRequestMatcher("/ws/**/xhr_send**");

    @Override
    public boolean matches(HttpServletRequest request) 
        if (allowedMethods.matcher(request.getMethod()).matches()) 
            return false;
        

        return !unprotectedMatcher.matches(request);
    

注意:它遵循http://blogs.sourceallies.com/2014/04/customizing-csrf-protection-in-spring-security/

【讨论】:

以上是关于启用 Spring Security CSRF 的 Sockjs 回退的主要内容,如果未能解决你的问题,请参考以下文章

使用 CSRF 登录后如何启用 Spring Security POST 重定向?

如何解决在使用 Spring Boot 和 Spring Security 启用 CSRF 后无法正常工作的登录问题?

需要为 /login spring security 禁用 CSRF

Spring Security 和 CSRF 攻击

Spring Security 3.2 CSRF 禁用特定 URL

如何仅在 localhost 的 Spring Security 中禁用 csrf?