如何使用Spring Security在现有HTTP环境中验证WebSocket

时间:2015-06-19 17:05:39

标签: spring-security basic-authentication spring-websocket java-websocket

我有一个非常简单的要求(我使用Spring-Security 4.0.1)但我在网上找不到任何示例,除了在此页面上被告知的内容:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html#websocket-server-handler

  

将WebSocketHandler集成到其他中相对简单   HTTP服务环境的帮助   WebSocketHttpRequestHandler。

我拥有的内容:使用基本身份验证完成工作的WebSocketHandler和HTTP服务环境的实现。我的WebApplicationInitializer看起来像这样:

public class MyWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        ...
        // WebSocket support - Handshake
        Dynamic ws = servletContext.addServlet("webSocketHttpRequestHandler", new HttpRequestHandlerServlet());
        ws.addMapping("/streaming/*");

        // Spring Security Filter
        FilterRegistration.Dynamic springSecurity = servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy());
        springSecurity.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), true, "/*");
    }
}

这就是我将websocket端点插入现有Web应用程序的方法。 我的WebSocket配置类看起来像(非常简化):

@Configuration
public class WebSocketServicesConfig{
    @Bean
    public WebSocketHttpRequestHandler webSocketHttpRequestHandler() {
        return new WebSocketHttpRequestHandler(new StreamingWebSocketHandler());
    }
}

StreamingWebSocketHandler实施WebSocketHandler

我还有一个使用配置的基本身份验证的 RESTful Web服务(在同一服务器中)。

工作正常:我的RESTful Web服务正在与任何Web浏览器配合使用。我可以做一些经过身份验证的查询(可以在HTTP标头中发送凭据)。 WebSocket查询正在工作,并在我第一次尝试进行身份验证时要求身份验证(在FireFox下,弹出窗口要求提供凭据,一旦我输入它们,客户端和服务器就能通过WebSocket消息进行通信)。 在我的WebSocketHandler中,包含有关经过身份验证的用户的信息的Spring对象:WebSocketSession是正确的(#getPrincipal()方法返回包含权限授予权限的Authentication,详细信息等等...)。 请注意,一旦对websocket进行身份验证,我就可以重新启动查询而无需重新输入。

我想要什么:从用户的角度来看,这很糟糕,因为凭据需要两次:

  1. 首先进行RESTful查询
  2. WebSocket查询的第二个
  3. 假设第一个身份验证成功,我如何绕过第二次身份验证?有没有办法检测客户端是否经过身份验证而不是要求凭据?

    我不想要:我不想既不使用Stomp over websocket也不使用SockJs(我不需要支持旧的网络浏览器)。

0 个答案:

没有答案