本项目是一个通用的前后端分离式的权限管理系统的后端工程,通过本项目你可以了解到什么是RBAC的权限系统设计范式以及如何实现权限管理.项目用的技术比较简单:SpringBoot SpringSecurity Mybatis-Plus Jwt Redis
RBAC是基于角色的访问控制(Role-Based Access Control
)在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。这样管理都是层级相互依赖的,权限赋予给角色,而把角色又赋予用户,这样的权限设计很清楚,管理起来很方便。
RBAC模型(Role-Based Access Control:基于角色的访问控制)模型是20世纪90年代研究出来的一种新模型,但其实在20世纪70年代的多用户计算时期,这种思想就已经被提出来,直到20世纪90年代中后期,RBAC才在研究团体中得到一些重视,并先后提出了许多类型的RBAC模型。其中以美国George Mason大学信息安全技术实验室(LIST)提出的RBAC96模型最具有代表,并得到了普遍的公认。
RBAC认为权限授权的过程可以抽象地概括为:Who是否可以对What进行How的访问操作,并对这个逻辑表达式进行判断是否为True的求解过程,也即是将权限问题转换为What、How的问题,Who、What、How构成了访问权限三元组.
在RBAC模型里面,有3个基础组成部分,分别是:用户、角色和权限。
RBAC通过定义角色的权限,并对用户授予某个角色从而来控制用户的权限,实现了用户和权限的逻辑分离(区别于ACL模型),极大地方便了权限的管理
下面在讲解之前,先介绍一些名词:
例如下图,管理员和普通用户被授予不同的权限,普通用户只能去修改和查看个人信息,而不能创建创建用户和冻结用户,而管理员由于被授 予所有权限,所以可以做所有操作。
RBAC支持三个著名的安全原则:最小权限原则、责任分离原则和数据抽象原则
总共三个表:
本项目持久层框架使用的是Mybatis-Plus这个十分流行的ORM框架,关于Mybatis-Plus的介绍看本项目其他配套笔记.
User(用户)类
@Data
@TableName("tb_user")
public class User {
@TableId
private Integer id;
@NotBlank(message="用户名不能为空")
private String username;
private String password;
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime; //创建时间
@TableField(exist = false)
private List<Role> roleList;
}
Role(角色)类
@Data
@NoArgsConstructor
@TableName("tb_role")
public class Role {
@TableId
private Integer roleId;
private String roleName; //角色名称
private String roleIdentity; //角色标识
@TableField(exist = false)
private List<Right> children; //权限列表
}
Right(权限)类
@Data
@NoArgsConstructor
@TableName("tb_right")
public class Right {
@TableId
private Integer id;
private String rightName; //权限名称
private Integer parentId; //上一级权限父节点
private String rootPath; //根路径
private String icon; //图标
private Integer level; //权限等级
private String identity;//权限标识
@TableField(exist = false)
private List<Right> children = new ArrayList<>(); //子节点
}
<dependency>
<!--mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!--SpringSecurity-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- HuTool工具类-->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.3.3</version>
</dependency>
</dependency>
自定义IUser继承SpringSecurity提供的User类,重写构造器.或者你直接使用SpringSecurity的User类,我这里只不过是为了扩充自定义的User的功能.
public class IUser extends User {
private Integer userId;
public IUser(Integer userId, String username, String password, Collection<? extends GrantedAuthority> authorities) {
super(username, password, authorities);
this.userId = userId;
}
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
}
自定义IUserDetailsService实现SpringSecuirty提供的UserDetailsService,
重写loadUserByUsername(String username)方法,在这个方法中定义查询用户以及用户的角色,角色对应的权限逻7辑.
@Service
public class IUserDetailsService implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Autowired
private RoleMapper roleMapper;
@Autowired
private RightMapper rightMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// 查询用户
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("username", username)
.eq("status", User.USER_STATUS_ON);
User user = userMapper.selectOne(wrapper);
if (user != null) {
// 声明一个权限集合
List<GrantedAuthority> authorityList = new ArrayList<>();
// 查询用户的角色
List<Role> roleList = roleMapper.selectRoleListByUID(user.getId());
if (!CollectionUtils.isEmpty(roleList)) {
for (Role role : roleList) {
//创建权限对象
GrantedAuthority authority = new SimpleGrantedAuthority("ROLE_" + role.getRoleName());
authorityList.add(authority);
}
}
//查询用户的权限
List<Right> rightList = rightMapper.selectRightListByUID(user.getId());
if (!CollectionUtils.isEmpty(rightList)) {
for (Right right : rightList) {
if (!StringUtils.isEmpty(right.getIdentity())) {
//创建权限对象
GrantedAuthority authority = new SimpleGrantedAuthority(right.getIdentity());
authorityList.add(authority);
}
}
}
log.info("用户ID ----{} ---- 拥有的权限: {}", user.getId(), authorityList);
return new IUser(user.getId(), user.getUsername(), user.getPassword(), authorityList);
}
return null;
}
}
定义SecurityConfig配置类继承WebSecurityConfigurerAdapter类,这个类由SpringSecurity提供.重写
public class SecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 自定义的用户细节service
*/
@Autowired
private UserDetailsService userDetailsService;
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
auth.userDetailsService(userDetailsService).passwordEncoder(encoder);
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。