私には非常に単純な要件があります (私は Spring-Security 4.0.1 を使用しています) が、このページで説明されていることを除いて、Web 上で例を見つけることができません: 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オブジェクトは正しいです(メソッドは、権限を付与された権限、詳細などを含むを返します...)。Websocket が認証されると、クエリを再入力せずに再起動できることに注意してください。WebSocketSession
#getPrincipal()
Authentication
私が欲しいもの:ユーザーの観点からは、資格情報が2回必要になるため、これは悪いことです:
- 最初の RESTful クエリ
- WebSocket クエリの 2 番目
最初の認証が成功したと仮定して、2 番目の認証をバイパスするにはどうすればよいですか? クライアントが認証されたことを検出し、資格情報を要求しない方法はありますか?
望まないこと: Stomp over websocketも SockJs も使用したくありません (古い Web ブラウザーをサポートする必要はありません)。