如何在用户角色权限中配置一对多映射



我有一个带有弹簧数据的 spring boot app(Spring boot 2(jpa.i 有 3 个 MYSQL 表来存储用户信息、角色和权限

用户
  • 将包含基本的用户详细信息,如用户名,密码名字,姓氏。
  • 角色代表用户角色,
  • 如管理员,用户,员工,测试(用户可以有许多角色(
  • 权限
  • 有3种可能性读,写,自定义(每个角色有很多权限(
  • 用户角色 - 用户和角色的联合表
  • 角色权限 - 角色和权限的联合表

我正在寻找 Spring 引导服务,如果未针对 User 表验证用户,它将返回 false,如果用户验证成功,则响应应包含用户角色和权限。

我能够构建示例休息服务,但未能设置以下内容

  1. 如何在此要求中为 oneToMany 映射配置实体类
  2. 存储库界面中的相应查询是什么

请参阅实体表

@Entity
@Table( name = "TURBINE_USER" )
public class PortalUser {
public PortalUser() {
}
public PortalUser(long userID ,String userName , String password , String firstName, String lastName, String email) {
this.userID = userID;
this.userName = userName;
this.password = password;
this.firstName = firstName;
this.lastName = lastName;
this.email =  email;
}

@Id
@Column(name="USER_ID",unique=true)
private long userID;
@NotNull
@Column(name="LOGIN_NAME",unique=true)
private String userName;
@NotNull
@Column(name="PASSWORD_VALUE")
private String password;
@NotNull
@ColumnDefault("")
@Column(name="FIRST_NAME")
private String firstName;
@NotNull
@ColumnDefault("")
@Column(name="LAST_NAME")
private String lastName;
@Column(name="EMAIL")
private String email;
@Column(name="CONFIRM_VALUE")
private String confirmValue;
@NotNull
@Column(name="CREATED")
private Timestamp createdDt;
@NotNull
@Column(name="MODIFIED")
private Timestamp modified;
@NotNull
@Column(name="LAST_LOGIN")
private Timestamp lastLogin;
@Column(name="DISABLED")
private char disabled;
@Column(name="OBJECTDATA")
private byte[]  objectData;
@NotNull
@Column(name="PASSWORD_CHANGED")
private Timestamp passwordChanged;
// getters and setters
}

@Entity
@Table(name =  "TURBINE_ROLE")
public class Role {
@Id
@Column(name=  "ROLE_ID",unique  = true)
private long roleId;
@Column(name= "ROLE_NAME")
private String roleName;
}

@Entity
@Table(name ="TURBINE_PERMISSION")
public class Permission {
@Id
@Column(name=  "PERMISSION_ID")
private long permissionId;
@Column(name= "PERMISSION_NAME")
private String name;
}
@Entity
@Table(name= "TURBINE_USER_GROUP_ROLE")
public class UserRoles {
@Column(name="USER_ID")
private PortalUser user;
@Column(name="ROLE_ID")
private Role roles;
}

@Entity
@Table(name="TURBINE_ROLE_PERMISSION")
public class RolePermission {
@Column(name= "ROLE_ID")
private Role roleId;
@Column(name= "PERMISSIONID")
private Permission permissionId;
}

它是用户与角色、角色和权限实体之间的多对多关系。不应将联接表定义为实体,它们由 JPA 实现生成/管理。

例如,用户和角色实体的多对多注释:

public class PortalUser {
...
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "User_Role",
joinColumns = {@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "role_id")})
private Set<Role> roles;
}

使用 CMobileCom JPA 进行测试。

免责声明:我是CMobileCom JPA的开发人员,CMobileCom JPA是Java和Android的轻量级JPA实现。

定义用户-角色-权限之间关系的简单方法之一是 - 为角色权限定义实体类,并在用户实体内声明多对多关系,这自动创建了两个链接表user_roleuser_permission

1. 角色实体类

@Entity
@Table(name = "ROLE")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
.
.
.
}

2. 权限实体类

@Entity
@Table(name = "PERMISSION")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Permission {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
.
.
.
}

3. 用户实体类

@Entity
@Table(name = "USER")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
.
.
.
// Relation with role
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(name="USER_ROLE",
joinColumns = {@JoinColumn (name="USER_ID", referencedColumnName="id")},
inverseJoinColumns = {@JoinColumn(name="ROLE_ID", referencedColumnName="id")}
)
private List<Role> roles;
// Relation with permission
@ManyToMany(cascade=CascadeType.ALL,fetch=FetchType.EAGER)
@JoinTable(name="USER_PERMISSION",
joinColumns = {@JoinColumn (name="USER_ID", referencedColumnName="id")},
inverseJoinColumns = {@JoinColumn(name="PERMISSION_ID", referencedColumnName="id")}
)
private List<Permission> permissions;
}

最新更新