【问题标题】:Controlling one user's access to another user's resources based on RBAC基于RBAC控制一个用户对另一个用户资源的访问
【发布时间】:2015-03-04 12:51:03
【问题描述】:

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

【问题讨论】:

    标签: ejb authorization access-control rbac abac


    【解决方案1】:

    您的应用程序逻辑(身份验证逻辑)应防止使用另一个用户身份调用该方法。在某种程度上,当你这样做时,你就是在欺骗别人的身份。

    因此,@RolesAllowed 注释应使用基于从框架检索到的用户 id 检索到的角色,而不是从用户手动传递的值中检索到的角色。举个 Servlet 世界的例子,你可以使用 HttpServletRequest 对象的 getUserPrincipal() 方法。

    我在此引用 Java EE 6 关于 servlet 的教程中的一段话。您可以将相同的原则外推到 ejbs。

    以编程方式检查来电者身份 一般来说,安全管理应该由容器以对 Web 组件透明的方式执行。本节中描述的安全 API 应仅在 Web 组件方法需要访问安全上下文信息的不太常见的情况下使用。

    • Servlet 3.0 指定了以下方法,使您能够访问有关组件调用者的安全信息:
    • getRemoteUser,它确定客户端进行身份验证的用户名。 getRemoteUser 方法返回由容器与请求关联的远程用户(调用者)的名称。如果没有用户通过身份验证,则此方法返回 null。
    • isUserInRole,确定远程用户是否具有特定的安全角色。如果没有用户通过身份验证,则此方法返回 false。此方法需要一个字符串用户角色名称参数。

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

    • getUserPrincipal,确定当前用户的主体名称,并返回一个 java.security.Principal 对象。如果没有用户通过身份验证,则此方法返回 null。对 getUserPrincipal 返回的 Principal 调用 getName 方法会返回远程用户的名称。

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

    来源:Using Programmatic Security with Web Applications

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2021-12-24
      相关资源
      最近更新 更多