2017-01-05 9 views
0

私たちは一連のアプリケーションを用意しています。これはすべて、ユーザーが複数のアプリケーションにアクセスするために複数回ログインできる場所です。複数のアプリケーション、同じセッションと更新のロール

管理者が新しい役割(新しいアプリケーションへのアクセスなど)(GrantedAuthority)を追加するようにユーザーを修正した場合、そのユーザーをすべてのアクティブなセッションに反映する必要があります。

問題は、SecurityContextHolderがSecurityContext(これはGrantedAuthoritiesを保持しています)にThreadLocalストレージを使用していると思います。

私はセッションリポジトリと対話してセッション情報を更新しようとしましたが、上記のTLストレージのためにアプリケーション全体に反映されません。

更新情報をこのようにして役割情報に伝達するパターン/戦略は共通していますか?

ありがとうございました。

+0

同じRedisセッションストアを共有して、すべてのアプリが同じセッション情報を使用していることを明確にするだけですか?または、OAuth2などの集中認証ソリューションを使用していますか? –

+0

同じ共有Redisセッションストアを使用しています。 –

答えて

0

最も単純な(そしてIMOが推奨する)ソリューションは、ユーザーに再認証を強いることで、新しいAuthenticationを作成してから、新鮮なGrantedAuthorityコレクションを作成することです。 Spring SessionのFindByIndexNameSessionRepositoryを使用して、特定のユーザーのすべてのセッションを取得してから削除することができます。これにより、すべてのアプリケーションに伝播するSessionDeletedEventが生成されます(同じRedisセッションストアを共有するため)。

アクティブなセッションを維持する必要がある場合は、状況がより複雑になります。特定のユーザーのすべてのセッションを取得するには、FindByIndexNameSessionRepositoryを使用できますが、各セッションでSecurityContextを抽出し、新しい機関でAuthenticationを更新し、セッションストアを共有するすべてのアプリケーションで完了していることを確認する必要があります。これを行うには、新しい機関(元のAuthenticationからの資格情報が必要)でAuthenticationを再作成できるように、ProviderManagereraseCredentialsAfterAuthenticationを無効にする必要があります。 SecurityContextがすべてのアプリケーションで更新されるようにするには、そのコードの実行をトリガーするために何らかの種類のパブリッシュ/サブスクライブメカニズムを採用する必要があります。

最初の解決方法は、はるかに簡単で安全です(eraseCredentialsAfterAuthenticationを無効にする必要がないため)。 Springセッションが(this ticketを参照)をサポートしていれば、publish-subscribeメカニズムの部分をカバーするので、2番目の解決策がより簡単になることにも注意してください。

+0

2つの選択肢に感謝します。感謝します。 –

関連する問題