13

Spring/AOPとアノテーションを使用して宣言型セキュリティを実装したいと思います。次のコードサンプルにあるように、アドバイスされたメソッドの実行を許可されるユーザーを定義するためのパラメーター「allowedRoles」を使用した制限付きアノテーションがあります。

    @Restricted(allowedRoles="jira-administrators")
        public void setPassword(...) throws UserMgmtException {             
               // set password code
               ...
        }

さて、問題は、私のアドバイスでは、定義された注釈にアクセスできないことです。

public Object checkPermission(ProceedingJoinPoint pjp) throws Throwable {

    Signature signature = pjp.getSignature();
    System.out.println("Allowed:" + rolesAllowedForJoinPoint(pjp));
            ...
}

private Restricted rolesAllowedForJoinPoint(ProceedingJoinPoint thisJoinPoint)
        {
            MethodSignature methodSignature = (MethodSignature) thisJoinPoint.getSignature();
            Method targetMethod = methodSignature.getMethod();

            return targetMethod.getAnnotation(Restricted.class);
        }

上記のメソッドは常にnullを返します(アノテーションはまったく見つかりません)。これに対する簡単な解決策はありますか?

AspectJエージェントの使用について何か読んだのですが、このエージェントは使用したくありません。

4

5 に答える 5

32

アノテーションの保持をRuntimeに変更した後も問題が解決しない場合は、同じ問題が発生している可能性があります。getMethod()は、実装クラスではなくインターフェイスメソッドを返します。したがって、クラスにアノテーションがある場合、インターフェイスメソッドのgetAnnotations()は当然nullを返します。

次の解決策でこの問題が解決しました。

final String methodName = pjp.getSignature().getName();
final MethodSignature methodSignature = (MethodSignature)pjp.getSignature();
Method method = methodSignature.getMethod();
if (method.getDeclaringClass().isInterface()) {
    method = pjp.getTarget().getClass().getDeclaredMethod(methodName, method.getParameterTypes());    
}

必要に応じて、ここでもインターフェイス注釈を処理するオプションがあります。

ここで利用可能ないくつかのコメント: ProceedingJoinPointからテンプレートメソッドインスタンスを取得する

オレグ

于 2011-03-09T00:42:41.763 に答える
13

@Restrictedはあなたの注釈だと思います。その場合は、次のことを確認してください。

@Retention(RetentionPolicy.RUNTIME)

アノテーション定義で。これは、注釈が実行時に保持されることを意味します。

于 2010-04-01T09:10:05.920 に答える
5

Bozhoが言及したように保持ポリシーを変更した後でも、アノテーションを取得するためのこの呼び出しはnullを返します。

targetMethod.getAnnotation(Restricted.class);

私が見つけたのは、注釈をバインドする必要があるということです。インターフェイスが次のように宣言されているとします。

 @Retention(RetentionPolicy.RUNTIME)
 public @interface Restricted {
     String[] allowedRoles();
  }

アドバイスは次のように宣言する必要があります。

       @Before("@annotation( restrictedAnnotation )")
       public Object processRequest(final ProceedingJoinPoint pjp, Restricted restrictedAnnotation) throws Throwable {
                  String[] roles = restrictedAnnotation.allowedRoles();
                  System.out.println("Allowed:" +  roles);
       }

これは、アノテーションをメソッドシグネチャのパラメーターrestrictedAnnotationにバインドします。注釈タイプを取得する方法がわからない部分は、パラメーターに基づいているようです。そして、注釈を付けたら、値を取得できます。

于 2010-09-01T02:56:34.927 に答える
2

Spring AOPMyManagerImpl implements MyManagerでは、ポイントカットがメソッドに適用されるinterfaceような状況がある場合は、アノテーションがないでMethodSignature定義されたメソッドについて説明します。MyManagerこれを修正するために私が見つけた唯一の方法は、jp.getTarget()オブジェクトのクラスを調べて、対応するメソッドを取得することです。

于 2011-02-16T17:28:45.493 に答える
2

SpringSecurityを使ってみませんか?実装して使用するのは簡単ですが、車輪の再発明に時間を浪費する意味はあまりわかりません。

于 2010-04-01T09:13:45.667 に答える