我有一个场景,允许具有特定角色的用户根据他自己的 id 调用 EJB 方法。在 EJB bean 上,我有@RolesAllowed
用户特定角色的注释。对于基于角色的检查,方法调用工作正常,但是如果图片中的用户调用传递另一个用户的 id 的 bean 方法,该方法仍然会被调用。我如何使用 RBAC 避免这种情况,或者我是否需要使用任何替代方式来实现这一点?
问问题
51 次
1 回答
0
您的应用程序逻辑(身份验证逻辑)应防止使用另一个用户身份调用该方法。在某种程度上,当你这样做时,你就是在欺骗别人的身份。
因此,@RolesAllowed
注释应该使用基于从框架中检索到的用户 ID 检索到的角色,而不是从用户手动传递的值中检索到的角色。举个 Servlet 世界的例子,您将使用 HttpServletRequest 对象的 getUserPrincipal() 方法。
我在这里引用了一段关于 servlet 的 Java EE 6 教程。您可以将相同的原则外推到 ejbs。
以编程方式检查调用者身份 通常,安全管理应由容器以对 Web 组件透明的方式强制执行。本节中描述的安全 API 应仅在 Web 组件方法需要访问安全上下文信息的不太常见的情况下使用。
- Servlet 3.0 指定了以下方法,使您能够访问有关组件调用者的安全信息:
- getRemoteUser,它确定客户端进行身份验证的用户名。getRemoteUser 方法返回由容器与请求关联的远程用户(调用者)的名称。如果没有用户通过身份验证,则此方法返回 null。
- isUserInRole,确定远程用户是否具有特定的安全角色。如果没有用户通过身份验证,则此方法返回 false。此方法需要一个字符串用户角色名称参数。
security-role-ref 元素应在部署描述符中声明,其中包含要传递给方法的角色名称的角色名称子元素。声明和链接角色引用中讨论了使用安全角色引用。
- getUserPrincipal,确定当前用户的主体名称,并返回一个 java.security.Principal 对象。如果没有用户通过身份验证,则此方法返回 null。对 getUserPrincipal 返回的 Principal 调用 getName 方法会返回远程用户的名称。
您的应用程序可以根据使用这些 API 获得的信息做出业务逻辑决策。
资料来源:在 Web 应用程序中使用编程安全性
于 2015-01-08T12:33:58.710 回答