权限管理作为后台管理系统中最基础的功能,技术上没啥难度当然也没啥挑战,但是对一个原先没写过权限管理功能的菜鸟来说也是一种学习吧。
权限管理,简单来说就是资源访问控制。只有授权的用户才能访问特定的资源或执行特定的操作。以下是基于角色的访问控制实现模型。
- 身份验证:这是确认用户身份的过程。当用户尝试登录系统时,系统会要求用户提供某种形式的凭证,如用户名和密码、智能卡、生物识别数据(如指纹或面部识别)或其他安全令牌。一旦凭证被验证,系统就可以确定用户的身份。
- 授权:授权是在身份验证之后发生的步骤,系统会检查已验证用户是否有权访问请求的资源或执行请求的操作。这通常基于预定义的角色、权限集或访问控制列表。
- 权限:权限具体定义了用户能够对资源做什么。例如,在文件系统中,权限可能包括读取、写入、执行或删除文件。在数据库中,权限可能包括查询、插入、更新或删除数据。
- 角色:角色是一组相关权限的集合,通常用于简化权限分配。例如,管理员角色可能拥有广泛的系统控制权限,而普通用户角色可能只允许查看和修改个人数据。
- 访问控制模型:权限管理可以通过不同的模型实现,常见的是基于角色的访问控制(RBAC)
以下是基于开源的权限认证框架Sa-Token的实现;官网:sa-token.cc/
1. 添加依赖
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot-starter</artifactId>
<version>1.38.0</version>
</dependency>
2. 设置配置文件 application.yml
sa-token:
# token名称 (同时也是cookie名称)
token-name: myToken
# token有效期,单位s 默认30天, -1代表永不过期
timeout: 2592000
# token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
activity-timeout: -1
# 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
is-share: false
# token风格
token-style: random-128
# 是否输出操作日志
is-log: false
3. 权限认证,核心逻辑就是判断一个账号是否拥有指定权限
@Component
@Slf4j
public class StpInterfaceImpl implements StpInterface {
/**
* <h2>返回一个账号所拥有的权限码集合 </h2>
*/
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
if (null == loginId) {
return null;
}
// 本 list 仅做模拟,实际项目中要根据具体业务逻辑来查询权限
List<String> list = new ArrayList<String>();
list.add("user.add");
list.add("user.update");
list.add("user.get");
list.add("user.delete");
...
return list;
}
/**
* <h2>返回一个账号所拥有的角色标识集合 (权限与角色可分开校验)</h2>
*/
@Override
public List<String> getRoleList(Object loginId, String loginType) {
if (null == loginId) {
return null;
}
// 本 list 仅做模拟,实际项目中要根据具体业务逻辑来查询角色
List<String> list = new ArrayList<String>();
list.add("admin");
...
return list;
}
}
4. 注解鉴权
/**
* <h2>列表查询</h2>
*/
@PostMapping("/list")
@SaCheckRole("admin")
@SaCheckPermission("sys:menu:list")
@Log(bizType = "查询", bizName = "查询菜单列表")
public List<SysMenu> selectList(@RequestBody SysMenu sysMenu) {
return iSysMenuService.selectList(sysMenu);
}
项目源码地址:
gitee.com/freedomdoub…