4

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

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

我所拥有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 查询

假设第一个身份验证成功,我如何绕过第二个身份验证?有没有办法检测客户端已通过身份验证而不要求提供凭据?

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

4

0 回答 0