我正在尝试根据我通过 Jersey/JAX-RS 公开的资源的角色设置身份验证。该资源存在于 Glassfish 实例中,其中基于角色的身份验证(具体来说,通过 @RolesAllowed)当前正在按需要工作。我在 servlet 容器中运行 Jersey:
<servlet-class>
com.sun.jersey.spi.container.servlet.ServletContainer
</servlet-class>
并正在对我的资源执行基本身份验证;该要求正在按预期得到执行。我还向 Jersey 提供了以下初始化参数:
<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,这要求用户处于我最初尝试测试的相同角色。看起来 Jersey 可能正在使用错误的 SecurityContext 等进行身份验证。还有其他人经历过吗?
在一行之前,我在类似的问题上挣扎了几个小时this http://pic.dhe.ibm.com/infocenter/wasinfo/v8r5/index.jsp?topic=%2Fcom.ibm.websphere.nd.multiplatform.doc%2Fae%2Ftwbs_jaxrs_impl_securejaxrs_webcont.htmlIBM 的文章让我大开眼界。令人惊讶的是,没有一本书或用户指南提到这个关键事实,没有它,身份验证就无法成功。
当使用基于注释的安全性时,web.xml 不是可选的;恰恰相反,<security-constraint>
元素必须存在; Web 容器在 JAX-RS 之前检查安全性,并且无需<security-constraint>
,未设置正确的安全上下文。因此,当 JAX-RS 调用时isUserInRole(role)
,它总是返回 false。
此外,无论是<security-role>
web.xml 中的元素或@DeclareRoles
注释必须存在。
最后,如果使用泽西岛,RolesAllowedDynamicFeature
需要在 Application 类中注册以启用基于注释的安全性。
其他那些因可悲的文档或缺乏文档而苦苦挣扎的人,就在那里。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)