一个基于SpringBoot的权限管理实战项目,堪称最佳实践!

242 阅读3分钟

1.png

权限管理作为后台管理系统中最基础的功能,技术上没啥难度当然也没啥挑战,但是对一个原先没写过权限管理功能的菜鸟来说也是一种学习吧。

权限管理,简单来说就是资源访问控制。只有授权的用户才能访问特定的资源或执行特定的操作。以下是基于角色的访问控制实现模型。

  1. 身份验证:这是确认用户身份的过程。当用户尝试登录系统时,系统会要求用户提供某种形式的凭证,如用户名和密码、智能卡、生物识别数据(如指纹或面部识别)或其他安全令牌。一旦凭证被验证,系统就可以确定用户的身份。
  2. 授权:授权是在身份验证之后发生的步骤,系统会检查已验证用户是否有权访问请求的资源或执行请求的操作。这通常基于预定义的角色、权限集或访问控制列表。
  3. 权限:权限具体定义了用户能够对资源做什么。例如,在文件系统中,权限可能包括读取、写入、执行或删除文件。在数据库中,权限可能包括查询、插入、更新或删除数据。
  4. 角色:角色是一组相关权限的集合,通常用于简化权限分配。例如,管理员角色可能拥有广泛的系统控制权限,而普通用户角色可能只允许查看和修改个人数据。
  5. 访问控制模型:权限管理可以通过不同的模型实现,常见的是基于角色的访问控制(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…