7

現在、@PreAuthorizeメソッド呼び出しを保護するためにSpringセキュリティとアノテーションを使用しています。ここで、runのようなメソッド呼び出しの認証トークンを変更したいと思います-SpringSecurityの認証置換で可能になります。

メソッドごとに置換を構成できますか?アノテーションごとに、SpEL式....そうでない場合、runAsManagerでどのメソッドが呼び出されているかを把握することは可能でしょうか?保護されたオブジェクトのセキュリティ構成属性を構成するにはどうすればよいですか?

4

2 に答える 2

7

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理由から、作成後は不変です。

于 2014-07-05T17:33:17.360 に答える
2

RunAsManager呼び出されたメソッドでカスタムアノテーションをチェックし、適切なトークンを返す独自のアノテーションを実装することで、これを解決しました。

よく働く。

于 2012-08-24T07:03:16.770 に答える