Run-As 認証の置き換え
AbstractSecurityInterceptor
は、セキュアオブジェクトのコールバックフェーズ中に、SecurityContext
および SecurityContextHolder
の Authentication
オブジェクトを一時的に置き換えることができます。これは、元の Authentication
オブジェクトが AuthenticationManager
および AccessDecisionManager
によって正常に処理された場合にのみ発生します。RunAsManager
は、SecurityInterceptorCallback
中に使用する必要がある置換 Authentication
オブジェクトがある場合はそれを示します。
セキュアオブジェクトのコールバックフェーズ中に Authentication
オブジェクトを一時的に置き換えることにより、セキュアな呼び出しは、異なる認証および認可資格情報を必要とする他のオブジェクトを呼び出すことができます。また、特定の GrantedAuthority
オブジェクトの内部セキュリティチェックを実行することもできます。Spring Security は、SecurityContextHolder
のコンテンツに基づいてリモーティングプロトコルを自動的に構成する多数のヘルパークラスを提供するため、これらの run-as 置換は、リモート Web サービスを呼び出すときに特に役立ちます。
構成
Spring Security は RunAsManager
インターフェースを提供します:
Authentication buildRunAs(Authentication authentication, Object object,
List<ConfigAttribute> config);
boolean supports(ConfigAttribute attribute);
boolean supports(Class clazz);
最初のメソッドは、メソッド呼び出しの期間中、既存の Authentication
オブジェクトを置き換える必要がある Authentication
オブジェクトを返します。メソッドが null
を返す場合は、置換を行う必要がないことを示しています。2 番目の方法は、構成属性の起動検証の一部として AbstractSecurityInterceptor
によって使用されます。supports(Class)
メソッドは、セキュリティインターセプターの実装によって呼び出され、構成された RunAsManager
がセキュリティインターセプターが提示する型のセキュアオブジェクトをサポートするようにします。
Spring Security は、RunAsManager
の 1 つの具体的な実装を提供します。ConfigAttribute
が RUN_AS_
で始まる場合、RunAsManagerImpl
クラスは置換 RunAsUserToken
を返します。そのような ConfigAttribute
が見つかった場合、置換 RunAsUserToken
には、元の Authentication
オブジェクトと同じプリンシパル、資格情報、付与された権限が、各 RUN_AS_
ConfigAttribute
の新しい SimpleGrantedAuthority
とともに含まれます。新しい SimpleGrantedAuthority
にはそれぞれ接頭辞 ROLE_
が付いており、その後に RUN_AS
ConfigAttribute
が続きます。例: RUN_AS_SERVER
は、ROLE_RUN_AS_SERVER
付与された権限を含む置換 RunAsUserToken
になります。
置換 RunAsUserToken
は、他の Authentication
オブジェクトと同様です。おそらく適切な AuthenticationProvider
への委譲を通じて、AuthenticationManager
によって認証される必要があります。RunAsImplAuthenticationProvider
はそのような認証を実行します。提示された RunAsUserToken
を有効として受け入れます。
悪意のあるコードが RunAsUserToken
を作成せず、RunAsImplAuthenticationProvider
が確実に受け入れられるように提示するために、生成されたすべてのトークンにキーのハッシュが保存されます。RunAsManagerImpl
と RunAsImplAuthenticationProvider
は、同じキーで Bean コンテキストに作成されます。
<bean id="runAsManager"
class="org.springframework.security.access.intercept.RunAsManagerImpl">
<property name="key" value="my_run_as_password"/>
</bean>
<bean id="runAsAuthenticationProvider"
class="org.springframework.security.access.intercept.RunAsImplAuthenticationProvider">
<property name="key" value="my_run_as_password"/>
</bean>
同じキーを使用することにより、承認された RunAsManagerImpl
によって作成されたため、各 RunAsUserToken
を検証できます。RunAsUserToken
は、セキュリティ上の理由から、作成後は不変です。