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