如何将JPA与具有用户,组和权限的简单权限系统一起使用?

时间:2011-09-01 14:29:57

标签: java jquery database jpa annotations

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

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

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

我的实体应该如何,以便我可以查询事物

  • 来自“群组视图”,例如“检索此群组的所有成员”
  • 和“用户视图”,例如“检索此用户所属的所有群组”
  • 以及“给定此用户和此组,用户拥有哪些权限”?

我正在使用Java 6和JPA2注释以及EclipseLink。

3 个答案:

答案 0 :(得分:1)

我在想

用户表 组表 User_is_in_group链接表

权利表。 User_in_group_has_Rights表。

然后将所有链接映射到JPA中的相关字段。

我可以做更多细节,但也许这足以让您创建实体,因为它还取决于您想要的字段。

答案 1 :(得分:1)

我想你可能想看一下应用服务器社区已经提供的实现。通常来说,您所描述的是基于表单的身份验证的定义。

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

基本上,关系是:

    User
      + Role[]

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

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

在这种情况下,Roles是一个(命名不佳的)枚举类型,存储在我的“角色”实体中:

@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”的字符串。

答案 2 :(得分:0)

以下是三个表(user,group和user_group)的示例:

@Entity
@Table(name="user")
public class User implements Serializable{

    private static final long serialVersionUID = 1L;

    private Long id;
    private String name;
    private String email;
    private String password;
    private List<Grupo> groups; //-> a lot of rules and permissions

    public Usuario(){
    }

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }

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

    @Column
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Column
    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    @Column
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    /** Here is the third table **/
    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name="user_group", joinColumns = @JoinColumn(name="user_id"),
                              inverseJoinColumns = @JoinColumn(name="group_id"))
    public List<Grupo> getGroups() {
        return groups;
    }

    public void setGroups(List<Grupo> groups) {
        this.groups = groups;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Usuario other = (Usuario) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}

//////////////////////

@Entity
@Table(name="group")
public class Group {

    private Long id;
    private String name;
    private String description;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Grupo other = (Grupo) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}