SpringBoot整合Sa-Token实现RBAC权限模型分步解析
一、RBAC模型核心要素
-
用户-角色-权限关系
- 用户(User)与角色(Role)建立多对多关系
- 角色(Role)与权限(Permission)建立多对多关系
- 权限定义示例:
user:add
,order:delete
-
权限验证流程
用户 → 角色集合 → ⋃ 权限集合 → 权限校验 \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) {
// 创建用户逻辑
}
}
三、权限数据缓存策略
-
权限加载时机
- 用户登录时加载角色权限关系
- 采用懒加载模式缓存至Redis
T T L = 2 h ( 默认缓存时间 ) TTL = 2h \quad (\text{默认缓存时间}) TTL=2h(默认缓存时间)
-
权限更新处理
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"
}
五、扩展优化建议
- 权限继承:通过角色继承树实现权限继承
- 数据权限:结合@SaCheckPermission实现行级数据过滤
- 动态路由:根据权限列表生成前端路由表
实现要点 :权限标识设计需遵循
资源:操作
格式,保证权限粒度可控。建议配合Sa-Token的[权限监控面板]进行实时调试。