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