WebSocket セキュリティ

Spring Security 4.0+ は、メッセージの認可をサポートします。これが有用である具体的な例の 1 つは、WebSocket ベースのアプリケーションで認可を提供することです。

<websocket-message-broker>

websocket-message-broker 要素には 2 つの異なるモードがあります。websocket-message-broker@id が指定されていない場合、次のことを行います。

  • SimpAnnotationMethodMessageHandler に AuthenticationPrincipalArgumentResolver がカスタム引数リゾルバーとして登録されていることを確認してください。これにより、@AuthenticationPrincipal を使用して現在の Authentication のプリンシパルを解決できます。

  • SecurityContextChannelInterceptor が clientInboundChannel に自動的に登録されるようにします。これにより、SecurityContextHolder にメッセージで見つかったユーザーが入力されます

  • ChannelSecurityInterceptor が clientInboundChannel に登録されていることを確認します。これにより、認可ルールをメッセージに指定できます。

  • CsrfChannelInterceptor が clientInboundChannel に登録されていることを確認します。これにより、元のドメインからのリクエストのみが有効になります。

  • CsrfTokenHandshakeInterceptor が WebSocketHttpRequestHandler、TransportHandlingSockJsService、または DefaultSockJsService に登録されていることを確認します。これにより、HttpServletRequest から予想される CsrfToken が WebSocket セッション属性にコピーされます。

追加の制御が必要な場合、ID を指定でき、ChannelSecurityInterceptor が指定された ID に割り当てられます。その後、Spring のメッセージングインフラストラクチャとのすべての接続を手動で行うことができます。これは面倒ですが、構成をより細かく制御できます。

<websocket-message-broker> の属性

  • id Bean 識別子。コンテキスト内の別の場所で ChannelSecurityInterceptor Bean を参照するために使用されます。指定した場合、Spring Security は Spring メッセージング内で明示的な構成を必要とします。指定しない場合、Spring Security は <websocket-message-broker> で説明されているように、メッセージングインフラストラクチャと自動的に統合されます。

  • same-origin-disabled CSRF トークンが Stomp ヘッダーに存在するという要件を無効にします(デフォルトは false)。デフォルトの変更は、他のオリジンが SockJS 接続を確立できるようにする必要がある場合に役立ちます。

  • authentication -manager-ref この AuthorizationManager インスタンスを使用します。設定すると、use-authorization-manager は無視され、true と見なされます。

  • use-authorization-manager SecurityMetadataSource API の代わりに AuthorizationManager API を使用します (デフォルトは true)。

  • security-context-holder-strategy-ref この SecurityContextHolderStrategy を使用する (AuthorizationManager API と組み合わせてのみサポートされることに注意してください)

<websocket-message-broker> の子要素

<intercept-message>

メッセージの認可規則を定義します。

<intercept-message> の親要素

<intercept-message> の属性

  • pattern メッセージの宛先に一致する ant ベースのパターン。例: "/ " は、宛先を持つすべてのメッセージに一致します。;"/admin/" は、宛先が "/admin/**" で始まるすべてのメッセージに一致します。

  • type 照合するメッセージの型。有効な値は SimpMessageType で定義されています(つまり、CONNECT、CONNECT_ACK、HEARTBEAT、MESSAGE、SUBSCRIBE、UNSUBSCRIBE、DISCONNECT、DISCONNECT_ACK、OTHER)。

  • access メッセージの保護に使用される式。例: "denyAll" は、一致するすべてのメッセージへのアクセスを拒否します。"permitAll" は、一致するすべてのメッセージへのアクセスを許可します。「hasRole('ADMIN')では、現在のユーザーが一致するメッセージのロール "ROLE_ADMIN" を持っている必要があります。