2013-09-27 92 views
2

我正在嘗試基於我通過Jersey/JAX-RS公開的資源的角色設置身份驗證。此資源存在於Glassfish實例中,在該實例中,基於角色(具體而言,通過@RolesAllowed)進行的身份驗證當前正在根據需要進行工作。我在一個servlet容器中運行Jersey:@RolesAllowed總是拒絕(禁止)澤西島資源

<servlet-class> 
     com.sun.jersey.spi.container.servlet.ServletContainer 
    </servlet-class> 

而且我在我的資源上執行基本身份驗證;該要求正在按預期執行。我還提供了以下初始化參數澤西島:

<init-param> 
     <param-name>com.sun.jersey.spi.container.ResourceFilters</param-name> 
     <param-value>com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory</param-value> 
    </init-param> 

然而,當我嘗試實際添加的@RolesAllowed批註,所有的訪問失敗。例如:

@Path("/my/resource") 
@ManagedBean 
@RolesAllowed({"SYSTEM"}) 
public class Resource { 
    // Accesses with credentials for a user that has the SYSTEM role fail! 
} 

如果我注入安全上下文並調用context.isUserInRole(),它將爲所有角色返回false。非常奇怪的是,如果我爲這個資源刪除我的@RolesAllowed註解,並使用有效的證書發出請求,那麼這個類可以成功訪問EJB,它需要用戶與我最初試圖測試的角色相同。看起來大概像澤西可能用錯誤的SecurityContext或其他一些認證。有沒有其他人經歷過這個?

+0

用戶如何授予角色並且角色被恰當地映射(參見[this](http://docs.oracle.com/javaee/7/tutorial/doc/security-intro005.htm#BNBXJ)以供參考)? – DannyMo

回答

4

我在this之前的一行中遇到過幾個小時的類似問題,IBM的文章讓我大開眼界。令人驚訝的是,沒有一本書或用戶指南提到這個關鍵事實,沒有它,認證不能成功。

當使用基於註釋的安全性時,web.xml不是可選的;完全相反,<security-constraint>元素必須存在; Web容器在JAX-RS執行之前和沒有<security-constraint>之前檢查安全性,未設置正確的安全上下文。因此,當JAX-RS調用isUserInRole(role)時,它總是返回false。

另外,web.xml中的<security-role>元素或@DeclareRoles註釋必須存在。

最後,如果使用Jersey,需要在Application類中註冊RolesAllowedDynamicFeature以啓用基於註釋的安全性。

HTH其他人與可悲的文件,或它的缺乏鬥爭,這是在那裏。

+0

是的,你很對!我發現這一點,我需要設置一個安全約束,以獲得適當的上下文。謝謝! – user2825122

+0

@ user2825122如果我的回答對您有幫助,請考慮將其投票。 –