Role-Based Access Control(RBAC),基于角色的访问控制。
引用网图:
一个用户可具备多角色,一个角色可具备多权限。表述,一个用户有什么身份,能对资源做什么操作。
ER图
设计RBAC的实现的表结构图:
注意
- 实例代码省略了Getter/Setter、省略UserDetails部分实现、省略equals和hashCode的重写。
- 禁止在JPA项目中使用lombok @Data,会引起不可预测的BUG,详细原因不做赘述。不过@Getter@Setter是没问题的。
User
省略Getter/Setter、省略equals和hashCode的重写。
@Entity
public class SysUser implements UserDetails {
@Id
@GeneratedValue
private long id;
@Column(nullable = false, unique = true)
private String name;
private String password;
private String cnname;
private Boolean enabled = Boolean.TRUE;
//多对多映射,用户角色
@ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
private List<SysRole> roles;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
List<GrantedAuthority> authorities = new ArrayList<>();
List<SysRole> roles = this.getRoles();
for (SysRole role : roles) {
authorities.add(new SimpleGrantedAuthority(role.getRole()));
}
return authorities;
}
}
Role
省略Getter/Setter、省略equals和hashCode的重写。
@Entity
public class SysRole {
@Id
@GeneratedValue
private Integer id;
private String cnname;
private String role; // 角色标识程序中判断使用,如"sys",这个是唯一的:
private String description; // 角色描述,UI界面显示使用
private Boolean available = Boolean.FALSE; // 是否可用,如果不可用将不会添加给用户
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "SysRolePermission", joinColumns = {@JoinColumn(name = "roleId")}, inverseJoinColumns = {@JoinColumn(name = "permissionId")})
private List<SysPermission> permissions; // 角色 -- 权限关系,多对多关系
@ManyToMany
@JoinTable(name = "SysUserRole", joinColumns = {@JoinColumn(name = "roleId")}, inverseJoinColumns = {@JoinColumn(name = "uid")})
private List<SysUser> userInfos; // 用户 - 角色关系定义,一个角色对应多个用户
}
Permission
省略Getter/Setter、省略equals和hashCode的重写。
@Entity
public class SysPermission implements Serializable {
@Id
@GeneratedValue
private Integer id;
private String name;
@Column(columnDefinition = "enum('menu','button')") // 资源类型,[menu|button]
private String resourceType;
private String url; // 资源路径
private String permission; // 权限字符串,menu例子:role:*,button例子:role:create,role:update,role:delete,role:view
private Long parentId; // 父编号
private String parentIds; // 父编号列表
private Boolean available = Boolean.FALSE;
@Transient
private List<?> permissions;
@ManyToMany
@JoinTable(name = "SysRolePermission", joinColumns = {@JoinColumn(name = "permissionId")}, inverseJoinColumns = {@JoinColumn(name = "roleId")})
private List<SysRole> roles;
public List<?> getPermissions() {
return Arrays.asList(this.permission.trim().split("\\|"));
}
public void setPermissions(List<?> permissions) {
this.permissions = permissions;
}
}
示例代码
https://github.com/lmmarise/springboot-security-jpa-rbac.git
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/180300.html