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的[权限监控面板]进行实时调试。

相关推荐
X566127 分钟前
如何在 Laravel 中正确保存嵌套动态表单数据(主服务与子服务)
jvm·数据库·python
虹科网络安全2 小时前
艾体宝干货|数据复制详解:类型、原理与适用场景
java·开发语言·数据库
2301_771717212 小时前
解决mysql报错:1406, Data too long for column
android·数据库·mysql
uzong2 小时前
9 种 RAG 架构,每位 AI 开发者必学:完整实战指南
后端
HackTorjan2 小时前
深度神经网络的反向传播与梯度优化原理
人工智能·spring boot·神经网络·机器学习·dnn
小江的记录本2 小时前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
dvjr cloi2 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
止语Lab2 小时前
从手动到框架:Go DI 演进的三个拐点
开发语言·后端·golang
dFObBIMmai3 小时前
MySQL主从同步中大事务导致的延迟_如何拆分大事务优化同步
jvm·数据库·python
szccyw03 小时前
mysql如何限制特定存储过程执行权限_MySQL存储过程安全访问
jvm·数据库·python