Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JPA与用户、组和权限的简单权限系统一起使用?_Java_Jquery_Database_Jpa_Annotations - Fatal编程技术网

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

Java 如何将JPA与用户、组和权限的简单权限系统一起使用?,java,jquery,database,jpa,annotations,Java,Jquery,Database,Jpa,Annotations,我想构建一个简单的ORM/数据库权限系统,其中我有用户、组和权限: 每个用户可以是多个组的成员,每个组可以有多个用户作为成员 用户和组之间的每个关系都有一条附加信息:权限 其思想是,每个用户可以在每个组中拥有不同的权限 我的实体应该是什么样子的,这样我就可以查询东西了 从“组视图”中,如“检索此组的所有成员” “用户视图”如“检索此用户所属的所有组” 以及“给定此用户和此组,用户拥有哪些权限” 我正在使用带有JPA2注释和EclipseLink的Java6 用户表 分组桌 用户\u是\u

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

  • 每个用户可以是多个组的成员,每个组可以有多个用户作为成员
  • 用户和组之间的每个关系都有一条附加信息:权限
其思想是,每个用户可以在每个组中拥有不同的权限

我的实体应该是什么样子的,这样我就可以查询东西了

  • 从“组视图”中,如“检索此组的所有成员”
  • “用户视图”如“检索此用户所属的所有组”
  • 以及“给定此用户和此组,用户拥有哪些权限”
我正在使用带有JPA2注释和EclipseLink的Java6

用户表 分组桌 用户\u是\u组链接表中的\u

权利表。 用户组中的用户有权限表

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


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

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

基本上,这种关系是:

    User
      + Role[]
一旦配置好,这就允许像JSF这样的框架(但是你会注意到我在这里访问Tomcat会话)查询特定的角色。下面的代码取自我在一个小型web应用程序上使用的一个基本的基于表单的身份验证方案,它急需重构,我只是有更高的优先级

public boolean isUserInRole(Roles role)
  {
    return FacesContext.getCurrentInstance().getExternalContext().isUserInRole(role.getRoleValue()); 
  }
在本例中,角色是存储在我的“角色”实体中的(名称不正确)枚举类型:

这最终会创建表(如我指定的字段),以便我可以向配置提供SQL查询并创建一个领域。如果你在谷歌上搜索“j_security_check”,有很多关于这个的好文档

作为一个群体?对我来说,组听起来像是角色的集合——因此,将查询修改为第三个表或仅仅提供一个枚举并不是一件费力的事


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

下面是一个包含三个表(用户、组和用户组)的示例:

@实体
@表(name=“user”)
公共类用户实现可序列化{
私有静态最终长serialVersionUID=1L;
私人长id;
私有字符串名称;
私人字符串电子邮件;
私有字符串密码;
私有列表组;//->许多规则和权限
公共用益{
}
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
@纵队
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
@纵队
公共字符串getEmail(){
回复邮件;
}
公用电子邮件(字符串电子邮件){
this.email=电子邮件;
}
@纵队
公共字符串getPassword(){
返回密码;
}
public void setPassword(字符串密码){
this.password=密码;
}
/**这是第三张桌子**/
@多个(级联=级联类型.ALL)
@JoinTable(name=“user\u group”,joinColumns=@JoinColumn(name=“user\u id”),
inverseJoinColumns=@JoinColumn(name=“group\u id”))
公共列表getGroups(){
返回组;
}
公共void集合组(列表组){
这个组=组;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((id==null)?0:id.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
Usuario其他=(Usuario)obj;
if(id==null){
if(other.id!=null)
返回false;
}如果(!id.equals(other.id))
返回false;
返回true;
}
}
//////////////////////
@实体
@表(name=“group”)
公共课组{
私人长id;
私有字符串名称;
私有字符串描述;
@身份证
@GeneratedValue(策略=GenerationType.IDENTITY)
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共字符串getDescription(){
返回说明;
}
公共void集合描述(字符串描述){
this.description=描述;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((id==null)?0:id.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
Grupo其他=(Grupo)obj;
if(id==null){
if(other.id!=null)
返回false;
}如果(!id.equals(other.id))
返回false;
返回true;
}
}

是的,我想知道更多细节。表格:用户{id,名称}组{id,名称}权限{id,名称}连接表格:用户{u在组{User\u id,组{u id}//仅在将用户添加到组时创建的行用户{u在组}中拥有{Rights\u id,用户{u在组}//仅在分配时创建的行
@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;
    }
}
@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;
    }

}