我试图实现一个@Restricted
注释,以便用户只有在登录并具有特定角色时才能访问它们的方式来保护控制器方法。我在使用JSF和CDI的Tomcat 7上,所以没有EJB。只要注解接口没有指定任何参数,拦截器就会被调用。只要我添加@Nonbinding Role value() default Role.ADMIN;
参数,拦截器和控制器方法都不会执行。没有错误或例外。这里是我的代码,我真的不知道有什么地方错了:当注释有参数时,CDI拦截器不起作用
译注:
@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()
我正在使用焊接1.1.10.Final。我尝试用OpenWebBeans(这是TomEE使用的CDI实现)替换Weld,但OpenWebBeans项目网站上没有任何文档(请参阅http://openwebbeans.apache.org/documentation.html,每个链接都已中断)。看起来我需要一些OpenWebBeans Maven依赖来在Tomcat 7上使用它,但没有文档我不知道哪些依赖。如果我切换到TomEE,是不是需要相同的Maven依赖关系,但用'提供的 '? –
Jack
是的,你会有提供的东西,而不是默认或编译。 – LightGuard