我試圖實現一個@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