最新の安定バージョンについては、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
は、セキュリティ上の理由から作成後に不変です