我有一个非常简单的要求(我使用 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 通过身份验证,我可以重新启动查询而无需重新输入它们。
我想要什么:从用户的角度来看,这很糟糕,因为需要两次凭据:
- 首先用于 RESTful 查询
- 第二个用于 WebSocket 查询
假设第一个身份验证成功,我如何绕过第二个身份验证?有没有办法检测客户端已通过身份验证而不要求提供凭据?
我不想要的:我不想使用Stomp over websocket和 SockJs(我不需要支持旧的网络浏览器)。