我想在具有通过sockJS with Stomp(JWT)进行基于令牌的身份验证的Spring Boot应用程序中使用websockets(Json Web Token)。在服务器上,有一个验证JWT令牌的过滤器。此令牌发送给请求标头,但SockJS客户端api不支持标头。这意味着,当SockJS客户端api尝试与服务器进行websocket握手时,例如:
new SockJS("http://localhost:8080/websocket")
JWT授权过滤器将拦截HTTP请求,并且握手将失败,因为请求上没有标头,因此过滤器将拒绝请求。我已经在论坛中看到了几种建议的解决方法,但是似乎没有一种方法适合这种情况:
我发现here可以通过查询参数在SockJS握手URL上发送令牌,而且我必须更改身份验证过滤器以查找查询参数,而不仅仅是标头。出于安全原因,我真的不喜欢在查询参数上发送令牌的解决方案。有更好的替代方法还是真的是最好的方法?
答案 0 :(得分:0)
HandshakeInterceptor:此解决方案无效,因为过滤器 总是在拦截器之前执行。
这就是我对与您完全相同的设置所做的。
您需要将websocket endpoint
添加到
@Override public void configure(WebSecurity registry)
喜欢
registry.ignoring().antMatchers("/websocket/**");
这将告诉Spring安全性不会触发套接字端点,因此不会为jwt
设置过滤器。