Run-Asをと組み合わせて実装する方法についての詳細な記事を投稿しました@PreAuthorize
。
1)カスタムロジックに基づいてメソッドの実行中に使用するRunAsManager
を作成する独自の実装を行います。Authentication
以下の例では、追加の役割を提供するカスタムアノテーションを使用しています。
public class AnnotationDrivenRunAsManager extends RunAsManagerImpl {
@Override
public Authentication buildRunAs(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {
if(!(object instanceof ReflectiveMethodInvocation) || ((ReflectiveMethodInvocation)object).getMethod().getAnnotation(RunAsRole.class) == null) {
return super.buildRunAs(authentication, object, attributes);
}
String roleName = ((ReflectiveMethodInvocation)object).getMethod().getAnnotation(RunAsRole.class).value();
if (roleName == null || roleName.isEmpty()) {
return null;
}
GrantedAuthority runAsAuthority = new SimpleGrantedAuthority(roleName);
List<GrantedAuthority> newAuthorities = new ArrayList<GrantedAuthority>();
// Add existing authorities
newAuthorities.addAll(authentication.getAuthorities());
// Add the new run-as authority
newAuthorities.add(runAsAuthority);
return new RunAsUserToken(getKey(), authentication.getPrincipal(), authentication.getCredentials(),
newAuthorities, authentication.getClass());
}
}
@RunAsRole
この実装は、保護されたメソッド(たとえば)のカスタムアノテーションを探し、@RunAsRole("ROLE_AUDITOR")
見つかった場合は、指定された権限(ROLE_AUDITOR
この場合)を付与された権限のリストに追加します。RunAsRole
それ自体は単純なカスタム注釈です。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RunAsRole {
String value();
}
2)マネージャーをインスタンス化します。
<bean id="runAsManager"
class="org.springframework.security.access.intercept.RunAsManagerImpl">
<property name="key" value="my_run_as_key"/>
</bean>
3)登録:
<global-method-security pre-post-annotations="enabled" run-as-manager-ref="runAsManager">
<expression-handler ref="expressionHandler"/>
</global-method-security>
4)コントローラーでの使用例:
@Controller
public class TransactionLogController {
@PreAuthorize("hasRole('ROLE_REGISTERED_USER')") //Authority needed to access the method
@RunAsRole("ROLE_AUDITOR") //Authority added by RunAsManager
@RequestMapping(value = "/transactions", method = RequestMethod.GET) //Spring MVC configuration. Not related to security
@ResponseBody //Spring MVC configuration. Not related to security
public List<Transaction> getTransactionLog(...) {
... //Invoke something in the backend requiring ROLE_AUDITOR
{
... //User does not have ROLE_AUDITOR here
}
編集:key
in
の値はRunAsManagerImpl
あなたが望むものなら何でもかまいません。これは、その使用に関するSpringドキュメントからの抜粋です。
RunAsUserToken
悪意のあるコードがを作成して提示しないようにするためRunAsImplAuthenticationProvider
に、キーのハッシュは生成されたすべてのトークンに保存されます。RunAsManagerImpl
およびは、同じキーを使用
RunAsImplAuthenticationProvider
してBeanコンテキストで作成されます。
<bean id="runAsManager"
class="org.springframework.security.access.intercept.RunAsManagerImpl">
<bean id="runAsAuthenticationProvider"
class="org.springframework.security.access.intercept.RunAsImplAuthenticationProvider">
同じキーを使用することにより、それぞれRunAsUserToken
が承認されたによって作成されたことを検証できますRunAsManagerImpl
。セキュリティ上のRunAsUserToken
理由から、作成後は不変です。