2015-01-06 36 views
0

我有一个场景,允许具有特定角色的用户根据自己的ID调用EJB方法。在EJB bean上,我有@RolesAllowed注释以及用户的特定角色。对于基于角色的检查,方法调用可以正常工作,但如果图片中的用户调用传递其他用户的id的方法,该方法仍然会被调用。我如何避免RBAC的这种情况,或者我需要使用任何替代方法来实现这一点?基于RBAC控制一个用户对另一个用户资源的访问

回答

0

您的应用程序逻辑(身份验证逻辑)应阻止使用其他用户身份的方法调用。在某种程度上,当你这样做时,你在欺骗别人的身份。

因此,@RolesAllowed注释应使用基于从框架检索的用户标识检索的角色,而不是用户手动传递的值。为了给你一个Servlet世界的例子,你需要使用HttpServletRequest对象的方法getUserPrincipal()。

我在这里引用了一段关于servlet的Java EE 6教程。你可以推断相同的原则ejbs。

检查来电显示编程 一般而言,安全管理应以这样的方式的容器是透明的Web组件来执行。本节中描述的安全性API只能用于Web组件方法需要访问安全上下文信息的较低频率情况。

  • 的Servlet 3.0规定了以下方法,使您可以访问有关组件的调用者的安全信息:
  • getRemoteUser,这就决定了与客户端身份验证的用户名。 getRemoteUser方法返回容器与请求关联的远程用户(调用者)的名称。如果没有用户被认证,这个方法返回null。
  • isUserInRole,它确定远程用户是否处于特定的安全角色。如果没有用户通过身份验证,则此方法返回false。此方法需要一个String用户角色名称参数。

应在部署描述符中声明security-role-ref元素,并使用角色名称子元素包含要传递给方法的角色名称。声明和链接角色引用中讨论了使用安全角色引用。

  • getUserPrincipal,它确定当前用户的主体名称并返回一个java.security.Principal对象。如果没有用户被认证,这个方法返回null。在由getUserPrincipal返回的Principal上调用getName方法将返回远程用户的名称。

您的应用程序可以根据使用这些API获取的信息做出业务逻辑决策。

来源:Using Programmatic Security with Web Applications

相关问题