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 接続を確立できるようにする必要がある場合に役立ちます。
security-context-holder-strategy-ref この
SecurityContextHolderStrategy
を使用する (AuthorizationManager
API と組み合わせてのみサポートされることに注意してください)
<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' ロールを持っている必要があります。