2017-10-17 4 views
3

@PreAuthorize( "hasRole( 'ADMIN')"を扱うアドバイスがReactiveアプリケーションのSecurityContextをどこで取得するのか説明できますか?@PreAuthorizeは反応的なアプリケーションで動作していますか、ThreadLocalなしではどうやって生きるのですか?

次の春のセキュリティの例は、使用状況のこの種の良い実例です:春のセキュリティWebfluxのソースコードをチェックした後https://github.com/spring-projects/spring-security/tree/5.0.0.M4/samples/javaconfig/hellowebflux-method

、私はSecurityContextRepositoryのいくつかの実装を見つけたが、loadメソッドは、としてServerWebExchangeを必要としますパラメータ。

標準サービスでSecurityContextHolder.getContext()。getAuthentication()を呼び出す方法を理解しようとしています(ThreadLocalはReactiveアプリケーションのオプションではありません)。しかし、 ServerWebExchangeでの参照なしのSecurityContextRepositoryへの呼び出しでこれを行います。

答えて

3

リクエストの処理が特定のスレッドに限定されていないため、ThreadLocalはオプションではなくなりました。

現在、Spring Securityは認証情報をServerWebExchange属性として格納しているため、現在の要求/応答のペアに関連付けられています。しかし、@PreAuthorizeのような現在の取引所に直接アクセスできない場合でも、その情報は必要です。 (Webアプリケーションでは、HTTPクライアントがSubscriberある特定に結び付けられたコンテキストを管理する -

認証情報は、非常に興味深い原子炉の機能があり、反応性のパイプライン自体(あなたMonoまたはFluxからそうアクセス可能)に保存されていますサーバーからデータを引き出し、そのように動作します)。

私は、SecurityContextHolderの同等物、またはコンテキストから認証情報を取得するためのいくつかのショートカットメソッドについて認識していません。

詳細はReactor Context feature in the reference documentationを参照してください。 that being used in Spring Security hereの例も参照できます。

関連する問題