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 は、セキュリティ上の理由から、作成後は不変です。