当前位置: 首页 > news >正文

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

SpringBoot整合Sa-Token实现RBAC权限模型分步解析

一、RBAC模型核心要素

  1. 用户-角色-权限关系

    • 用户(User)与角色(Role)建立多对多关系
    • 角色(Role)与权限(Permission)建立多对多关系
    • 权限定义示例:user:add, order:delete
  2. 权限验证流程
    用户 → 角色集合 → ⋃ 权限集合 → 权限校验 \text{用户} \rightarrow \text{角色集合} \rightarrow \bigcup \text{权限集合} \rightarrow \text{权限校验} 用户角色集合权限集合权限校验

二、整合实现步骤

步骤1:引入依赖

<dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId><version>1.34.0</version>
</dependency>

步骤2:数据库设计

CREATE TABLE sys_user (id BIGINT PRIMARY KEY,username VARCHAR(50) UNIQUE
);CREATE TABLE sys_role (id BIGINT PRIMARY KEY,role_key VARCHAR(50) UNIQUE
);CREATE TABLE sys_permission (id BIGINT PRIMARY KEY,perm_key VARCHAR(100) UNIQUE
);-- 关联表
CREATE TABLE user_role (user_id BIGINT, role_id BIGINT);
CREATE TABLE role_perm (role_id BIGINT, perm_id BIGINT);

步骤3:权限绑定实现

// 用户登录时绑定角色
StpUtil.login(userId);
StpUtil.getSession().set("role", getRolesByUserId(userId));// 角色权限关系查询
public List<String> getPermissions(Long roleId) {return permissionMapper.selectByRoleId(roleId);
}

步骤4:权限校验拦截器

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new SaInterceptor(handle -> {// 获取请求路径对应的权限标识String requiredPerm = requestPathToPerm(request.getRequestURI());// 校验当前用户是否具备权限if (!StpUtil.hasPermission(requiredPerm)) {throw new NotPermissionException(requiredPerm);}})).addPathPatterns("/api/**");}
}

步骤5:注解式权限控制

@RestController
@RequestMapping("/user")
public class UserController {@SaCheckPermission("user:manage")@PostMappingpublic Result createUser(@RequestBody User user) {// 创建用户逻辑}
}

三、权限数据缓存策略

  1. 权限加载时机

    • 用户登录时加载角色权限关系
    • 采用懒加载模式缓存至Redis
      T T L = 2 h ( 默认缓存时间 ) TTL = 2h \quad (\text{默认缓存时间}) TTL=2h(默认缓存时间)
  2. 权限更新处理

    // 角色权限变更时清除相关缓存
    public void updateRolePermissions(Long roleId, List<String> newPerms) {roleService.updatePermissions(roleId, newPerms);SaTokenDao dao = SaManager.getSaTokenDao();dao.delete("permission_cache::" + roleId);
    }
    

四、接口测试验证

GET /api/users
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...# 响应示例(无权限时)
{"code": 403,"msg": "无访问权限:user:query"
}

五、扩展优化建议

  1. 权限继承:通过角色继承树实现权限继承
  2. 数据权限:结合@SaCheckPermission实现行级数据过滤
  3. 动态路由:根据权限列表生成前端路由表

实现要点:权限标识设计需遵循资源:操作格式,保证权限粒度可控。建议配合Sa-Token的[权限监控面板]进行实时调试。

http://www.xdnf.cn/news/724699.html

相关文章:

  • 使用 `\033` 方式设置终端字体颜色
  • .NET 查找 DLL 的路径顺序
  • 【图像处理基石】如何进行图像畸变校正?
  • vb.net oledb-Access 数据库本身不支持命名参数,赋值必须和参数顺序一致才行
  • 华为OD机试_2025 B卷_数组组成的最小数字(Python,100分)(附详细解题思路)
  • 联邦学习常见问题
  • 动手学深度学习pytorch学习笔记 —— 第五章
  • 《算力觉醒!ONNX Runtime + DirectML如何点燃Windows ARM设备的AI引擎》
  • AtCoder Beginner Contest 407 E - Most Valuable Parentheses
  • Linux服务器运维10个基础命令
  • WEB3——什么是ABI
  • 包管理工具
  • RocketMQ 死信队列(DLQ)实战:原理 + 开发 + 运维 + 架构应用指南
  • 云原生 Cloud Native Build (CNB)使用初体验
  • 相机--RGBD相机
  • 移动安全Android——客户端数据安全
  • 英语中最难学的部分是时态‌
  • 深入解析 Redis Cluster 架构与实现(一)
  • Spring Web高保真Axure动态交互元件库
  • Axure疑难杂症:中继器图片替换功能优化(支持修改已有记录-玩转中继器)
  • 直播预告 | 聚焦芯必达|打造可靠高效的国产 MCU 与智能 SBC 汽车解决方案
  • AI生态警报:MCP协议风险与应对指南(下)——MCP Host安全
  • 鸿蒙OSUniApp导航栏组件开发:打造清新简约的用户界面#三方框架 #Uniapp
  • Pyenv 使用指南:多版本 Python 环境管理
  • 视频加密技术和防翻录技术有哪些?
  • linux、docker、git相关操作
  • 当 Python 遇上 Go:Sponge 如何成为替代 Django/Flask 的理想选择
  • 论文略读:Surge Phenomenon in Optimal Learning Rate and Batch Size Scaling
  • 实验分享|基于sCMOS相机科学成像技术的耐高温航空涂层材料损伤检测实验
  • 相机--RGB相机