如何仅将 EJB 角色授予某些实体
Posted
技术标签:
【中文标题】如何仅将 EJB 角色授予某些实体【英文标题】:How to grant EJB roles only to certain entities 【发布时间】:2017-06-27 15:23:00 【问题描述】:我们正在构建一个 Java Web 应用程序。我们在 Wildfly 9.2 中使用 EJB 容器和 JPA。
现在我们要集成一个权限系统,其中一个用户有一个特定的角色,但是这个角色只有结合特定的实体才能被授予。我将把这个访问资源命名为部门。
所以我们会有一个存储在这样一个表中的用户权限列表:
| User ID | Department | Role |
| ------- | ---------- | ------- |
| 1 | A | MANAGER |
| 1 | B | ADMIN |
| 2 | B | MANAGER |
此外,我们还有全局角色。如果上表中没有相关部门的条目,则用户具有一组将应用的全局角色。
| User ID | Role |
| ------- | ------- |
| 1 | VIEWER |
| 3 | MANAGER |
在给定部门的情况下,我们如何轻松检查用户是否属于某个角色?
通过使用注解@RolesAllowed,我们可以检查某个角色,但不限于部门。
【问题讨论】:
过滤器怎么样?给定一个 URL,是否知道该 URL 将访问哪个部门?如果用户不在这些部门,则拒绝该请求。无论解决方案如何,当重组和部门发生变化时会发生什么? 或者可能是 EJB 层上的拦截器。 感谢您的建议。我们当然对此进行了调查。我们目前也在研究 Apache Shiro。这可能满足我们的要求。 【参考方案1】:请记住,企业 Java 安全角色与授权有关。
因此,您也可以将部门建模为您的安全系统中的一个角色。为用户分配多个安全角色是完全可以的。
因此,给定 B 部门的经理:
@RolesAllowed("manager", "B"
public void someBusinessMethod(...)
...
只有经理和部门 B 的用户才授权调用此方法。
【讨论】:
感谢您的建议,但我们的部门是动态的。所以我们不能将它们硬编码到我们的注释中。【参考方案2】:原来 EJB 没有我们想要的特性。 我们迁移到 Apache Shiro Security 并且对它非常满意。
始终必须以编程方式检查基于资源的权限。静态角色和基于权限的检查可以是注解。
【讨论】:
以上是关于如何仅将 EJB 角色授予某些实体的主要内容,如果未能解决你的问题,请参考以下文章
如何在Dynamics 365中向用户授予对实体的特定记录的读写访问请求?