2

Websockets と RabbitMQ をブローカーとして Spring MVC 4 を使用する小さなプロジェクトを作成しました。単一のユーザー (convertAndSendToUser) に送り返そうとしていますが、機能していないようです。アプリケーションの機能は次のとおりです。

  1. HTTP 経由で Spring Security に認証します。認証は AJAX を介して行われ、バックエンドはすべての新しい接続にユーザー名として UUID を割り当てます。同じユーザー名を持つ複数のクライアントが存在する可能性があるため、同じユーザー名でログインしている可能性がありますが、個々のブラウザーをターゲットにできるようにしたいと考えています。
  2. AJAX で認証した後、webapp は Websocket で STOMP を使用して API に接続します。これらは、CONNECT FRAME で送り返されるヘッダーです。

    body: "" command: "CONNECTED" headers: Object heart-beat: "0,0" server: "RabbitMQ/3.3.1" session: "session-OGzAN6T8Y0X9ft3Jq04fiQ" user-name: "88dc9424-72e3-4814-be8c- e31dbf89b521" バージョン: "1.1"

ご覧のとおり、frame-suffixまたは session-id フィールドはありません。

  1. バックエンドから convertAndSendToUser を使用すると、応答は /exchange/jobs-userh6g_48h9 のような一意のキューに送信されます。キュー名は /exchange/jobs ですが、Spring は自動的にサフィックス-userh6g_48h9を付加します。ユーザー名は "user" で、sessionId は "h6g_48h9" です。これで問題ありません。この動作が必要ですが、問題は、クライアント (webapp) が CONNECT フレームでこのセッション ID を取得せず、取得する方法がないことです。実際にその一意のキューにサブスクライブします。

これを解決するには?クライアントがこのサフィックスを取得して、独自のキューにサブスクライブできるように、接続時にキュー サフィックス/セッション ID が返されます。現在、この情報が不足しているため、サーバーからメッセージが返されません。

4

1 に答える 1

0

間違っている場合は訂正してください。ただし、UserDestinationMessageHandler により、クライアントはサブスクライブできるはずで/user/exchange/jobsあり、そのメッセージ ハンドラがキュー名を修正します。

補足として、次のような AbstractSecurityWebSocketMessageBrokerConfigurer を拡張する構成クラスを追加することも検討する必要があります。

@Configuration
public class WebSocketSecurityConfig extends AbstractSecurityWebSocketMessageBrokerConfigurer {

    @Override
    protected void configureInbound(MessageSecurityMetadataSourceRegistry messages) {
        messages
                .antMatchers(SimpMessageType.MESSAGE, "/topic/**", "/queue/**").denyAll() // Prevent users sending messages directly to topics and queues
                .antMatchers(SimpMessageType.SUBSCRIBE, "/queue/**/*-user*", "/topic/**/*-user*").denyAll() // Prevent users from subscriptions to private queues
                .antMatchers("/user/queue/errors").permitAll()
                .anyMessage().hasRole("ANY_OPTIONAL_ROLE_ETC")
        ;
    }
}

これにより、「進取の気性に富んだ」ユーザーが、サブスクライブすべきでないものにサブスクライブするのを防ぐことができます。

于 2015-02-27T06:20:13.160 に答える