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

相关推荐
qq_192779874 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
u0109272714 小时前
使用Plotly创建交互式图表
jvm·数据库·python
爱学习的阿磊4 小时前
Python GUI开发:Tkinter入门教程
jvm·数据库·python
tudficdew5 小时前
实战:用Python分析某电商销售数据
jvm·数据库·python
sjjhd6525 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
Configure-Handler5 小时前
buildroot System configuration
java·服务器·数据库
2301_821369615 小时前
用Python生成艺术:分形与算法绘图
jvm·数据库·python
电商API_180079052476 小时前
第三方淘宝商品详情 API 全维度调用指南:从技术对接到生产落地
java·大数据·前端·数据库·人工智能·网络爬虫
一点程序6 小时前
基于SpringBoot的选课调查系统
java·spring boot·后端·选课调查系统
2401_832131956 小时前
Python单元测试(unittest)实战指南
jvm·数据库·python