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:引入依赖

xml 复制代码
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.34.0</version>
</dependency>

步骤2:数据库设计

sql 复制代码
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:权限绑定实现

java 复制代码
// 用户登录时绑定角色
StpUtil.login(userId);
StpUtil.getSession().set("role", getRolesByUserId(userId));

// 角色权限关系查询
public List<String> getPermissions(Long roleId) {
    return permissionMapper.selectByRoleId(roleId);
}

步骤4:权限校验拦截器

java 复制代码
@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    @Override
    public 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:注解式权限控制

java 复制代码
@RestController
@RequestMapping("/user")
public class UserController {
    
    @SaCheckPermission("user:manage")
    @PostMapping
    public Result createUser(@RequestBody User user) {
        // 创建用户逻辑
    }
}

三、权限数据缓存策略

  1. 权限加载时机

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

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

四、接口测试验证

http 复制代码
GET /api/users
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

# 响应示例(无权限时)
{
  "code": 403,
  "msg": "无访问权限:user:query"
}

五、扩展优化建议

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

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

相关推荐
Tony Bai4 小时前
“我曾想付钱给 Google 去工作”—— Russ Cox 深度访谈:Go 的诞生、演进与未来
开发语言·后端·golang
Mr.Pascal4 小时前
Redis:主动更新,读时更新,定时任务。三种的优劣势对比
数据库·redis·缓存
思成不止于此4 小时前
【MySQL 零基础入门】DQL 核心语法(二):表条件查询与分组查询篇
android·数据库·笔记·学习·mysql
骥龙5 小时前
3.10、构建网络防线:防火墙、WAF 与蜜罐实战
服务器·网络·数据库·网络安全
serendipity_hky5 小时前
【SpringCloud | 第2篇】OpenFeign远程调用
java·后端·spring·spring cloud·openfeign
嘟嘟MD5 小时前
程序员副业 | 2025年11月复盘
后端·创业
SadSunset5 小时前
(15)抽象工厂模式(了解)
java·笔记·后端·spring·抽象工厂模式
汝生淮南吾在北5 小时前
SpringBoot+Vue养老院管理系统
vue.js·spring boot·后端·毕业设计·毕设
李慕婉学姐6 小时前
【开题答辩过程】以《基于springboot的地铁综合服务管理系统的设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·spring boot·后端
期待のcode6 小时前
Springboot配置属性绑定
java·spring boot·后端