java - 如何使用带有用户、组和权限的简单权限系统的 JPA?

标签 java jquery database jpa annotations

我想构建一个简单的 ORM/数据库权限系统,其中我有用户、组和权限:

  • 每个用户可以是多个群组的成员,每个群组可以有多个用户作为成员。
  • 用户和群组之间的每个关系都有一条附加信息:权限。

这个想法是每个用户在每个组中可以拥有不同的权限。

我的实体应该是什么样子,以便我可以查询事物

  • 从“群组 View ”,例如“检索该群组的所有成员”
  • 以及“用户 View ”,例如“检索该用户所属的所有群组”
  • 以及“给定该用户和该组,该用户拥有哪些权限”?

我使用带有 JPA2 注释和 EclipseLink 的 Java 6。

最佳答案

我认为您可能想查看应用程序服务器社区已经提供的实现。一般来说,您所描述的是基于表单的身份验证的定义。

http://tomcat.apache.org/tomcat-5.5-doc/config/realm.html

基本上来说,关系是:

    User
      + Role[]

配置完成后,它允许 JSF 等框架(但您会注意到我正在此处访问 Tomcat session )查询特定角色。下面的代码取 self 在一个小型网络应用程序上的基于表单的基本身份验证方案,它迫切需要重构,我只是有更高的优先级

public boolean isUserInRole(Roles role)
  {
    return FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role.getRoleValue()); 
  }

在本例中,角色是一个(命名不佳的)枚举类型,存储在我的“角色”实体中:

@Entity
@Table(name = "role", uniqueConstraints = @UniqueConstraint(columnNames = { "user_user", "role" }))
public class Role implements Serializable
{
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    @ManyToOne(targetEntity = User.class, fetch = FetchType.LAZY)
    private User user;
    private String role;

    public Long getId()
    {
        return id;
    }

    public void setId(Long id)
    {
        this.id = id;
    }

    public User getUser()
    {
        return user;
    }

    public void setUser(User user)
    {
        this.user = user;
    }

    public String getRole()
    {
        return role;
    }

    public void setRole(String role)
    {
        this.role = role;
    }
}

这最终会创建表(正如我指定的字段一样),以便我可以向配置提供 SQL 查询并创建领域。如果您在 Google 上搜索“j_security_check”,就会有很多关于这方面的优秀文档。

至于一个团体吗?对我来说,组听起来像是角色的集合,因此修改对第三个表的查询或简单地提供一个枚举并不困难。

(读完本文后,唯一需要澄清的是,我的角色存储在一个枚举中,其中包含角色的字符串值,因此 Roles.getValue() 返回一个类似“administrators”的字符串。

关于java - 如何使用带有用户、组和权限的简单权限系统的 JPA?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7271833/

相关文章:

jquery - Fancybox 2 宽度错误

jquery - 如果另一个 Div 为空则隐藏 div

html - 单击播放按钮时捕获事件

php - 每天有 40000 多条记录的数据库

mysql - 使用 Eloquent laravel 检索所有数据

java - 撤消 IDatabaseTester setDataSet()

java - 在 IntelliJ 中的库 jar 中设置断点

php - jQuery $.post 发送正确的变量,但 PHP 什么也没收到

java - 在Android中获取当月的最后一个时间戳

java - JPA EntityManager 不一致地将对象添加到数据库