6

@Restrictedユーザーがログインして特定の役割を持っている場合にのみ、ユーザーがアクセスできるようにコントローラーメソッドを保護するために、注釈を実装しようとしています。私はJSFとCDIを使用してTomcat 7を使用しているため、EJBはありません。インターセプターは、注釈インターフェースがパラメーターを指定しない限り呼び出されます。パラメーターを追加するとすぐに@Nonbinding Role value() default Role.ADMIN;、インターセプターもコントローラー メソッドも実行されません。エラーも例外もありません。これが私のコードです。何が問題なのか本当にわかりません。

注釈:

@InterceptorBinding
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface Restricted {
    @Nonbinding Role value() default Role.ADMIN; // ###
}

インターセプター:

@Interceptor
@Restricted
public class RoleBasedRestrictingInterceptor implements Serializable {
    @Inject
    ISecurityManager security;

    @AroundInvoke
    public Object intercept(final InvocationContext ctx) throws Exception {
        final Restricted annotation = ctx.getClass().getAnnotation(Restricted.class);
        log.info("Intercepted, required role is: {}", annotation.value()); // ###
        log.info("User is logged in: {}", security.isLoggedIn());
        return ctx.proceed();
    }
}

コントローラ:

@Named("manageUsers")
@SessionScoped
public class ManageUsersBacking extends implements Serializable {   
    @Restricted(Role.ADMIN) // ###
    public void testRestricted() {
        log.info("testRestricted()");
    }
}

オカレンスは、###再び機能させるために変更または削除する必要があるものを示します。インターセプターはWEB-INF/beans.xml、アノテーションに role パラメーターがなくても機能するため、 で適切に定義されています。

16:04:33.772 [http-apr-8080-exec-11] INFO  c.m.s.RoleBasedRestrictingInterceptor - User is logged in: true
16:04:33.772 [http-apr-8080-exec-11] INFO  c.m.c.admin.ManageUsersBacking - testRestricted()
4

3 に答える 3

5

今日、私はこの特定の問題を再検討し、CDI とは何の関係もないことに気付きました。

ctx.getClass().getAnnotation(Restricted.class)

明らかに、私の例にはクラス レベルの注釈はありません。したがって、 getAnnotation() は を返しますnull。代わりに、次を使用する必要がありました。

ctx.getMethod().getAnnotation(Restricted.class)

例外がまったくない理由はわかりませんが。アプリケーションを TomEE に移行したため、再現できなくなった可能性があります。

于 2013-04-09T19:46:20.393 に答える
1

TomEE に切り替えると、実装に依存する (maven) 必要がなくなります。API だけを使用します (提供されたスコープで org.apache.openejb:javaee-api:6.0-4 を使用します)。

于 2013-03-31T20:27:31.283 に答える
0

正しくセットアップされているようです (beans.xml とインターセプター)。どの CDI 実装を使用していますか? Tomcat を使用している場合、TomEE の使用を検討しましたか?

于 2013-03-31T15:26:09.430 に答える