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

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
胡写代码3 天前
别再前后端各写一套表单校验了
java·后端
大勇前进3 天前
原生 PHP 还是 Laravel?小项目到底要不要上框架
后端
这个DBA有点耶3 天前
MVCC深入:Read View、版本链与快照读——InnoDB并发控制的内核
数据库·mysql·架构
vipxieliang3 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot
yuzhi_liu3 天前
我用 LangGraph4j 实现 Multi-Agent Supervisor
后端
alsmile3 天前
Node-RED 之外,国产规则引擎的新方案:基于标准语法,Go 先行实现
后端·开源·go
大白803 天前
PHP 内存溢出排查思路:看懂报错日志,精准定位问题
后端