@RolesAllowed总是在Jersey资源上拒绝(禁止)

我正在尝试根据我通过Jersey / JAX-RS公开的资源的角色设置身份validation。 此资源存在于Glassfish实例中,其中基于角色(特别是通过@RolesAllowed)的身份validation当前正在按需运行。 我在servlet容器中运行Jersey:

 com.sun.jersey.spi.container.servlet.ServletContainer  

并在我的资源上执行基本身份validation; 该要求正在按预期执行。 我还为Jersey提供了以下初始化参数:

   com.sun.jersey.spi.container.ResourceFilters com.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactory  

但是,当我尝试实际添加@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进行身份validation,或者其他一些。 还有其他人经历过这个吗?

几个小时之前,我一直在努力解决类似的问题,然而这篇 IBM文章中的一行开启了我的视线。 令人惊讶的是,没有一本书或用户指南提到这个关键事实,没有它,认证就无法成功。

使用基于注释的安全性时, web.xml不是可选的 ; 相反, 元素必须存在; Web容器在JAX-RS执行之前检查安全性,如果没有 ,则不会设置正确的安全上下文。 因此,当JAX-RS调用isUserInRole(role) ,它总是返回false。

此外,必须存在web.xml中的元素或@DeclareRoles注释。

最后,如果使用Jersey, RolesAllowedDynamicFeature需要在Application类中注册RolesAllowedDynamicFeature以启用基于注释的安全性。

HTH其他人在那里挣扎着可怜的文件或缺乏文件。