Spring security SockJS在不同域(CORS)上不传递凭据信息

Spring security SockJS在不同域(CORS)上不传递凭据信息,spring-security,cors,sockjs,spring-websocket,Spring Security,Cors,Sockjs,Spring Websocket,我们有一个使用Spring4的websocket服务器端实现。它已配置为对auth/authz使用spring安全性。在客户端,我们使用sockJS,当客户端与服务器位于同一个域时,它可以完美地工作 通过这种方式调用websocket 套接字=新的SockJS(“”) 这最终会调用以决定要使用的传输。这一切都很好 然而,当使用来自不同域的客户端时,我看到凭据被剥离。因此,当该客户端位于不同的域上时,我看到正在进行的调用是: . 我看不到正在传递凭据。因此,我得到一个401错误(未经授权)用户。我

我们有一个使用Spring4的websocket服务器端实现。它已配置为对auth/authz使用spring安全性。在客户端,我们使用sockJS,当客户端与服务器位于同一个域时,它可以完美地工作

通过这种方式调用websocket

套接字=新的SockJS(“”)

这最终会调用以决定要使用的传输。这一切都很好

然而,当使用来自不同域的客户端时,我看到凭据被剥离。因此,当该客户端位于不同的域上时,我看到正在进行的调用是: . 我看不到正在传递凭据。因此,我得到一个401错误(未经授权)用户。我们在服务器端具有CORS配置,并且还具有:

访问控制允许凭据“true”


有人能帮帮我吗?我没有选择,我不明白为什么凭据会被删除?这可能与CORS有关吗?

即使
XmlHttpRequest.withCredentials=true
(由SockJS客户端完成)并且
访问控制允许凭据=true
,您不能在URL中为跨域请求传递用户名和密码

为了使用基本身份验证,您需要自己创建
授权
头,但SockJS客户端目前似乎不允许这样做。有一个问题需要这样的支持,我补充了说明,我们需要它来支持基本身份验证

由于授权头不是a,将在实际请求之前发送a。但是Spring Framework当前默认情况下,因此即使在客户端设置了授权头,您也需要在Spring Framework中启用OPTIONS requests Dispatch

使用
web.xml

<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
  <param-name>dispatchOptionsRequest</param-name>
  <param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>

非常感谢您提供的建议。它澄清了很多问题。因此,听起来要让端到端功能正常工作,我们必须等待SockJS社区的修复。我的理解正确吗?同时,我们决定使用Spring的“纯”websocket支持。这意味着删除.withSockJS()方法。我们已经验证了它在使用基于java的纯websocket客户端时工作正常。是否有一种解决方法可用于浏览器客户端(使用纯websocket JS)跨域传递凭据?
@Override
protected void customizeRegistration(Dynamic registration) {
    registration.setInitParameter("dispatchOptionsRequest", "true");
}