4

私には非常に単純な要件があります (私は 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 メッセージを介して通信できます)。私のでは、認証されたユーザーに関する情報を含むWebSocketHandlerSpringオブジェクトは正しいです(メソッドは、権限を付与された権限、詳細などを含むを返します...)。Websocket が認証されると、クエリを再入力せずに再起動できることに注意してください。WebSocketSession#getPrincipal()Authentication

私が欲しいもの:ユーザーの観点からは、資格情報が2回必要になるため、これは悪いことです:

  1. 最初の RESTful クエリ
  2. WebSocket クエリの 2 番目

最初の認証が成功したと仮定して、2 番目の認証をバイパスするにはどうすればよいですか? クライアントが認証されたことを検出し、資格情報を要求しない方法はありますか?

望まないこと: Stomp over websocketも SockJs も使用したくありません (古い Web ブラウザーをサポートする必要はありません)。

4

0 に答える 0