2013-03-29 71 views
4

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

回答

4

後一個漫長的故事[1] ...今天我重新審視這個特殊的問題,並發現它沒有任何關係與CDI:

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

顯然,在我的例子中,沒有一流水平的註解所以getAnnotation()返回null。相反,我應該使用以下內容:

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

雖然我不知道爲什麼那裏沒有任何例外。也許還有其他一些事情正在進行,我不能再複製,因爲...

[1] ...我將我的申請遷移到TomEE,這是一個痛苦的屁股,花了我一個多星期。而且我仍然需要在生產環境中部署TomEE,並在Apache代理之後部署,因此仍需要完成一些配置。如果它終於出來了,可能值得付出努力,因爲我也有一些其他的CDI問題(例如,注入到JAX-RS服務的CDI bean無法使用Weld + Resteasy + Tomcat),現在已經不存在了。我也喜歡EJB和容器管理的事務。但是,當有人試圖將小部件甚至Java EE的一個子集與Tomcat一起使用時,我認爲不鼓勵讚美TomEE。它的許多API實現是,意思是可以在各種環境(甚至Java SE)中工作,這是一件好事。因此,如果您不需要TomEE來實現其某些高級Java EE功能,則不能推薦此舉。一些問題將會消失,但其他問題將會出現。而且你不能再在不同的API實現中自由選擇。但是,這不是針對TomEE的聲明。習慣於Tomcat我真的很喜歡TomEE的想法。

0

這聽起來像你有東西設置正確(beans.xml和攔截器)。你在使用哪種CDI實現?如果您使用Tomcat,您是否使用過TomEE?

+0

我正在使用焊接1.1.10.Final。我嘗試用OpenWebBeans(這是TomEE使用的CDI實現)替換Weld,但OpenWebBeans項目網站上沒有任何文檔(請參閱http://openwebbeans.apache.org/documentation.html,每個鏈接都已中斷)。看起來我需要一些OpenWebBeans Maven依賴來在Tomcat 7上使用它,但沒有文檔我不知道哪些依賴。如果我切換到TomEE,是不是需要相同的Maven依賴關係,但用'提供的'? – Jack

+0

是的,你會有提供的東西,而不是默認或編譯。 – LightGuard

1

如果切換到TomEE你不需要依賴(Maven的)上實現,只是API(使用org.apache.openejb:JavaEE的-API:6.0-4與所提供的範圍