我正在尝试实现@Restricted注释,以保护控制器方法,使其仅在用户登录并具有特定角色时才可以访问它们。我在使用JSF和CDI的Tomcat 7上,所以没有EJB。只要注释接口未指定任何参数,拦截器就会被调用。一旦添加@Nonbinding Role value() default Role.ADMIN;参数,拦截器和控制器方法都不会执行。也没有错误或异常。这是我的代码,我真的不知道这是怎么回事:
@Restricted
@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参数即可正常工作。
###
WEB- INF/beans.xml
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()
今天,我重新审视了这个特殊的问题,并注意到它与CDI无关:
ctx.getClass().getAnnotation(Restricted.class)
显然,在我的示例中没有类级别的注释。因此getAnnotation()返回null。相反,我应该使用以下内容:
null
ctx.getMethod().getAnnotation(Restricted.class)
虽然我不知道为什么那里没有例外。也许正在发生其他事情,因为我将应用程序迁移到TomEE,因此无法再复制。