36.1 D e l e g a t i n g S e c u rityContextRunnable委任セキュリティコンテキスト実行可能

4187 ワード

Spring Security同時サポートで最も基本的なコンポーネントの1つはdelegatingsecuritycontextrunableです.実行可能な委任をパッケージ化し、その委任に指定されたセキュリティコンテキストSecurityContextを使用してセキュリティコンテキストコンテナSecurityContextHolderを初期化します.その後、依頼Runnableを呼び出し、SecurityContextHolderがクリアされることを確認します.delegatingsecuritycontextrunableは次のように見えます.
1 public void run() {
2 try {
3     SecurityContextHolder.setContext(securityContext);
4     delegate.run();
5 } finally {
6     SecurityContextHolder.clearContext();
7 }
8 }

非常に簡単ですが、セキュリティコンテキストを1つのスレッドから別のスレッドにシームレスに移行できます.これは、ほとんどの場合、セキュリティコンテキスト所有者が各スレッドに基づいて操作するため重要です.たとえば、Spring Securityの41.4.1セクション「」サポートを使用して、サービスを保護することができます.これにより、現在のスレッドのセキュリティコンテキストをセキュリティサービスを呼び出すスレッドに簡単に移行できます.次の例を参照してください.
 1 Runnable originalRunnable = new Runnable() {
 2     public void run() {
 3      // invoke secured service
 4    }
 5 };
 6 
 7 SecurityContext context = SecurityContextHolder.getContext();
 8 DelegatingSecurityContextRunnable wrappedRunnable = new DelegatingSecurityContextRunnable(originalRunnable, context);
10 new Thread(wrappedRunnable).start();

上のコードでは、次の手順に従います.
私たちのセキュリティサービスを呼び出すRunnableを作成します.スプリングの安全性を知らないので注意してください
SecurityContextHolderから使用するセキュリティコンテキストを取得し、delegatingsecuritycontextrunableを初期化します.
delegatingsecuritycontextrunableを使用してスレッドを作成する
作成したスレッドを開始
SecurityContextHolderからSecurityContextを持つdelegatingsecuritycritycontextranableを作成するのは一般的なので、ショートカットコンストラクション関数があります.次のコードは、上のコードと同じです.
 1 Runnable originalRunnable = new Runnable() {
 2   public void run() {
 3     // invoke secured service
 4   }
 5 };
 6 
 7 DelegatingSecurityContextRunnable wrappedRunnable =   new DelegatingSecurityContextRunnable(originalRunnable);
 8 new Thread(wrappedRunnable).start();

私たちが持っているコードは簡単ですが、Spring Securityを使用していることを知る必要があります.次のセクションでは、d e l e g a t i n g securitycontextexecutorを使用してSpring Securityを使用している事実を隠す方法について説明します.