客户机未被授权进行此调用JAX-RS EJB错误



我一直在寻找解决这个问题的方法,这里是…

我遵循本教程从数据库自动生成jax-rs web服务:https://netbeans.org/kb/docs/websvc/rest.html

这工作得很好,但是当我试图通过用@RolesAllowed("myRole")注释资源方法来保护应用程序时,我得到了这个异常…

"WARNING: EJB5184:在调用EJB LicenceFacadeREST时发生系统异常,方法:public java.util.List resources.LicenceFacadeREST.findAll()警告:javax.ejb.AccessLocalException: Client not authorized for this invocation"

我已经将其缩小到EJB JACC策略检查失败。当我不在资源类中使用EJB/JPA时,即使存在@RolesAllowed注释,也不会抛出异常。

可以在这里找到完整的玻璃鱼堆栈踪迹http://pastebin.com/AUPKWaqe

这里有一些额外的信息,我遵循下面的Jersey安全指南。https://jersey.java.net/documentation/latest/security.html d0e10816

我使用ContainerRequestFilter进行身份验证,如果身份验证成功,我将设置SecurityContext的自定义实现,rolesalloweddynamic特性将与rolesallowed注释一起使用,以授权对特定资源的访问。这三个组件允许我在应用程序级别而不是容器级别进行身份验证和授权。

在我的应用程序从servlet转换为EJB/servlet(我向jax-rs资源类添加了一个无状态EJB注释)之前,这种方法一直工作得很好。EJB使用rolesallowed注释在容器级别限制对其bean方法的访问,因此它与我的应用程序级别身份验证/授权相冲突。

我仍然在寻找一个全面的解决方案,即使它禁用EJB级别的方法安全性,所以我可以让ContainerRequestFilter进行身份验证,并让rolesalloweddynamicfeature进行授权。

最新更新