最新の安定バージョンについては、Spring Security 6.4.5 を使用してください!

Run-As 認証の置き換え

概要

AbstractSecurityInterceptor は、セキュアオブジェクトコールバックフェーズ中に、SecurityContext および SecurityContextHolder の Authentication オブジェクトを一時的に置き換えることができます。これは、元の Authentication オブジェクトが AuthenticationManager および AccessDecisionManager によって正常に処理された場合にのみ発生します。RunAsManager は、SecurityInterceptorCallback の間に使用される置換 Authentication オブジェクトがあれば、それを示します。

セキュアオブジェクトのコールバックフェーズ中に Authentication オブジェクトを一時的に置き換えることにより、セキュアな呼び出しは、異なる認証および認可のクレデンシャルを必要とする他のオブジェクトを呼び出すことができます。また、特定の GrantedAuthority オブジェクトの内部セキュリティチェックを実行することもできます。Spring Security は、SecurityContextHolder の内容に基づいてリモートプロトコルを自動的に構成する多数のヘルパークラスを提供するため、これらの実行としての置換は、リモート Web サービスを呼び出すときに特に役立ちます。

構成

RunAsManager インターフェースは、Spring Security によって提供されます。

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 がセキュリティインターセプターが提示する型のセキュアオブジェクトをサポートするようにします。

RunAsManager の具体的な実装の 1 つは、Spring Security で提供されます。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>

同じキーを使用することにより、各 RunAsUserToken は、承認された RunAsManagerImpl によって作成されたことを検証できます。RunAsUserToken は、セキュリティ上の理由から作成後に不変です