我一直在寻找解决方案,这里有......
我按照本教程从数据库中自动生成jax-rs Web服务:https://netbeans.org/kb/docs/websvc/rest.html
这很好用,但是当我尝试使用@RolesAllowed(" myRole")注释资源方法来保护应用程序时,我得到了这个例外......
"警告:EJB5184:在EJB LicenceFacadeREST上调用期间发生系统异常,方法:public java.util.List resources.LicenceFacadeREST.findAll() 警告:javax.ejb.AccessLocalException:客户端未获得此调用的授权"
我已将其缩小到EJB JACC策略检查失败。当我不在资源类中使用EJB / JPA时,即使存在@RolesAllowed注释,也不会抛出异常。
找到完整的玻璃鱼堆痕迹答案 0 :(得分:0)
这里有一些额外的信息,我按照下面的泽西安全指南。 https://jersey.java.net/documentation/latest/security.html#d0e10816
我使用ContainerRequestFilter进行身份验证,这里我设置了SecurityContext的自定义实现,如果身份验证成功,则rolesalloweddynamic功能将使用rolesallowed注释来授权访问特定资源。
这三个组件允许我在应用程序级别进行身份验证和授权,而不是在容器级别进行身份验证和授权
这很好用,直到我的应用程序从servlet转换为EJB / servlet(我将无状态ejb注释添加到jax-rs资源类)。 EJB使用rolesallowed注释来限制在容器级别访问其bean方法,因此它与我的应用程序级别身份验证/授权冲突。
我仍然在寻找一个全面的解决方案,即使它禁用了EJB级别方法的安全性,因此我可以将其留给ContainerRequestFilter进行身份验证,并将rolesalloweddynamicfeature授权。