Spring安全和Stomp没有看到标题

时间:2015-03-04 17:02:57

标签: spring-security stomp

我有一个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”,但是没有任何内容。

2 个答案:

答案 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 );
    });