我有一个spring安全应用程序,我正在尝试使用Stomp实现websockets。
该应用程序主要基于REST,使用令牌来提高安全性。所有进入的请求都必须在标题中包含安全令牌。
问题是当使用基本html设置一个简单的Stomp客户端时,spring看起来没有看到任何标题。
如果禁用安全性,客户端可以正常工作,在这种情况下不会传入任何标头。
var socket = new SockJS('http://localhost:8080/project/ws/wsendpoint');
var headers = {'Auth': 'some_auth_token'}
writeConsole("Created socket");
stompClient = Stomp.over(socket);
stompClient.connect(headers, function(frame) {
writeConsole("Connected to via WebSocket");
stompClient.subscribe('/topic/push', function(message)
{ writeConsole(message.body);}, headers );
});
window.onbeforeunload = disconnectClient;
下面是相关的弹簧配置
protected void configure(final HttpSecurity http) throws Exception {
http
.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.headers().frameOptions().sameOrigin()
.and()
.authorizeRequests()
.anyRequest().authenticated() authenticated.
.and()
.anonymous().disable()
.exceptionHandling().authenticationEntryPoint(authenticationEntryPoint());
http.addFilterBefore(authenticationTokenFilter(), BasicAuthenticationFilter.class);
}
authenticationTokenFilter类中的doFilter应该看到客户端中设置的标题字段“Auth”,但是没有任何内容。
答案 0 :(得分:0)
Stomp在初始身份验证阶段无法发送任何自定义标头。解决此问题的方法是将身份验证令牌作为查询参数发送(不建议用于非封闭系统)。
答案 1 :(得分:0)
您可以使用自己的ID替换sessionId,而不是发送标头。
var sessionId = utils.random_string(36);
var socket = new SockJS('/socket', [], {
sessionId: () => {
return sessionId
}
});
stompClient = Stomp.over(socket);
stompClient.connect(headers, function(frame) {
writeConsole("Connected to via WebSocket");
stompClient.subscribe('/topic/push', function(message)
{ writeConsole(message.body);}, headers );
});