如何仅将 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中向用户授予对实体的特定记录的读写访问请求?

jHipster:仅将某些实体公开为REST端点

如何根据实体类型授予权限?

当延迟加载禁用时,如何通过实体框架仅将导航属性的特定属性包含到查询中?

扩展 EntityType,仅将选项设置为选定的实体

迁移 EJB2.x BMP 实体 bean