权限控制相关数据表分析和创建
实体类分析:包含用户、角色、权限三大块
用户User,角色Role,权限Permission
为了方便进行动态的菜单管理,也就是不同权限用户进入到后台系统所看到的菜单是不同的。所以再新增一个菜单Menu实体。不同用户的系统菜单,可以根据用户角色进行管理,因而角色跟菜单形成了多对多的映射关系。
用户:就是系统的登录用户
权限:无论是粗粒度还是细粒度,都需要描述权限的相关信息,如果是粗粒度的权限控制,可能需要在权限表中描述访问起源的URL信息。
角色:就是为了方便对用户进行授权,可以理解为角色就是权限的集合。
用户–角色:多对多的关系。一个用户可以拥有多个角色,一个角色也可以同时被多个用户拥有。
角色–权限:也是多对多的关系。角色就是权限的集合嘛,不同角色也可以拥有相同的权限。
三个实体多对多的表关联,需要两张中间表,因此一共需要创建五张数据表。
再加上菜单的引入,一共需要创建七张表。
这四个实体类的代码如下:
User
/**
* @description:后台用户
*/
@Entity
@Table(name = “T_USER”)
public class User {
@Id
@GeneratedValue
@Column(name = “C_ID”)
private int id; // 主键
@Column(name = “C_BIRTHDAY”)
private Date birthday; // 生日
@Column(name = “C_GENDER”)
private String gender; // 性别
@Column(name = “C_PASSWORD”)
private String password; // 密码
@Column(name = “C_REMARK”)
private String remark; // 备注
@Column(name = “C_STATION”)
private String station; // 状态
@Column(name = “C_TELEPHONE”)
private String telephone; // 联系电话
@Column(name = “C_USERNAME”, unique = true)
private String username; // 登陆用户名
@Column(name = “C_NICKNAME”)
private String nickname; // 真实姓名
@ManyToMany
@JoinTable(name = “T_USER_ROLE”, joinColumns = {
@JoinColumn(name = “C_USER_ID”, referencedColumnName = “C_ID”) }, inverseJoinColumns = {
@JoinColumn(name = “C_ROLE_ID”, referencedColumnName = “C_ID”) })
private Set roles = new HashSet(0);
}
Role
/**
* @description:角色
*/
@Entity
@Table(name = "T_ROLE")
public class Role {
@Id
@GeneratedValue
@Column(name = "C_ID")
private int id;
@Column(name = "C_NAME")
private String name; // 角色名称
@Column(name = "C_KEYWORD")
private String keyword; // 角色关键字,用于权限控制
@Column(name = "C_DESCRIPTION")
private String description; // 描述
@ManyToMany(mappedBy = "roles")
private Set<User> users = new HashSet<User>(0);
@ManyToMany
@JoinTable(name = "T_ROLE_PERMISSION", joinColumns = {
@JoinColumn(name = "C_ROLE_ID", referencedColumnName = "C_ID") }, inverseJoinColumns = {
@JoinColumn(name = "C_PERMISSION_ID", referencedColumnName = "C_ID") })
private Set<Permission> permissions = new HashSet<Permission>(0);
@ManyToMany
@JoinTable(name = "T_ROLE_MENU", joinColumns = {
@JoinColumn(name = "C_ROLE_ID", referencedColumnName = "C_ID") }, inverseJoinColumns = {
@JoinColumn(name = "C_MENU_ID", referencedColumnName = "C_ID") })
private Set<Menu> menus = new HashSet<Menu>(0);
}
Permission
/**
* @description:权限名称
*/
@Entity
@Table(name = "T_PERMISSION")
public class Permission {
@Id
@GeneratedValue
@Column(name = "C_ID")
private int id;
@Column(name = "C_NAME")
private String name; // 权限名称
@Column(name = "C_KEYWORD")
private String keyword; // 权限关键字,用于权限控制
@Column(name = "C_DESCRIPTION")
private String description; // 描述
@ManyToMany(mappedBy = "permissions")
private Set<Role> roles = new HashSet<Role>(0);
}
Menu
/**
* @description:菜单
*/
@Entity
@Table(name = "T_MENU")
public class Menu {
@Id
@GeneratedValue
@Column(name = "C_ID")
private int id;
@Column(name = "C_NAME")
private String name; // 菜单名称
@Column(name = "C_PAGE")
private String page; // 访问路径
@Column(name = "C_PRIORITY")
private Integer priority; // 优先级
@Column(name = "C_DESCRIPTION")
private String description; // 描述
@ManyToMany(mappedBy = "menus")
private Set<Role> roles = new HashSet<Role>(0);
@OneToMany(mappedBy = "parentMenu")
private Set<Menu> childrenMenus = new HashSet<Menu>();
@ManyToOne
@JoinColumn(name = "C_PID")
private Menu parentMenu;
}