xxx理系统权限体系总结与配置指南
根据过往相关的数据表结构、初始数据和AuthController等设计代码,总结了一份完整的权限体系总结与配置指南文档:
文件位置:c:\DevOpsK8s\ABC\carbon-manage-platform\PERMISSION_SYSTEM_COMPLETE_GUIDE.md
文档主要内容
一、权限体系概述
- 基于角色的访问控制(RBAC)模型
- 多租户(Multi-Tenancy)架构
- 核心设计理念:最小权限原则、职责分离、租户隔离、灵活配置、审计追踪
二、数据库表结构
- 核心权限表:
sys_tenant、sys_user、sys_role、sys_permission、sys_user_role、sys_role_permission - 权限类型:模块权限、菜单权限、按钮权限
三、认证与授权流程
- 登录认证流程:用户验证、密码检查、角色验证、JWT令牌生成
- JWT令牌结构:包含用户名、用户ID、租户ID、用户角色等信息
- 权限检查流程:令牌验证、权限提取、访问控制
四、从0配置用户权限的详细步骤
- 准备工作:确保系统初始化完成,超级管理员账户可用
- 创建租户(可选):为新企业或组织创建独立工作空间
- 创建权限:按模块、菜单、按钮层次创建权限
- 创建角色:根据岗位需求创建角色
- 分配角色权限:将权限分配给角色
- 创建用户:创建新用户并设置初始密码
- 分配用户角色:将角色分配给用户
- 验证权限配置:登录验证权限是否正确
五、权限管理最佳实践
- 权限设计原则:模块化管理、层级分明、命名规范、最小权限、定期审计
- 常见角色设计:超级管理员、租户管理员、碳分析师、数据采集员、监控操作员等
六、权限问题排查
- 常见权限错误及解决方案
- 排查步骤:登录状态、令牌验证、角色分配、权限关联
七、代码实现关键点
- AuthController核心代码分析:用户认证、角色检查、JWT令牌生成
- 权限检查实现:Spring Security的@PreAuthorize注解
这份文档提供了完整的权限体系说明和详细的配置步骤,您可以根据实际需求参考使用。(详细文档可私)
地图模块权限配置案例
一、需求分析
- 新增功能模块:地图模块
- 主菜单:地图模块
- 子菜单:地图设备分布、地图事件分布
- 授权对象:
- 管理角色(假设对应设备管理员角色)
- 普通查看用户(对应数据查看员角色)
二、详细配置步骤
1. 创建地图模块主权限
-- 创建地图模块主权限(模块级)
INSERT IGNORE INTO `sys_permission` (...) VALUES (
'perm-0050', 'MAP_MANAGE', '地图模块', ...
);
2. 创建地图设备分布子菜单权限
-- 创建地图设备分布子菜单权限(菜单级)
INSERT IGNORE INTO `sys_permission` (...) VALUES (
'perm-0051', 'MAP_DEVICE_DISTRIBUTION', '地图设备分布', ...
);
3. 创建地图事件分布子菜单权限
-- 创建地图事件分布子菜单权限(菜单级)
INSERT IGNORE INTO `sys_permission` (...) VALUES (
'perm-0052', 'MAP_EVENT_DISTRIBUTION', '地图事件分布', ...
);
备注这里使用的是给出角色赋予权限,(还有一种基于用户属性配置权限的方式)

role-0008、 role-0009 这2个的角色赋予权限说明如下
4. 为管理角色分配权限
-- 为设备管理员角色分配地图权限
INSERT IGNORE INTO `sys_role_permission` VALUES (
'role-0008', 'perm-0050', NOW()
);
-- 分配子菜单权限...
INSERT IGNORE INTO `sys_role_permission` VALUES (
'role-0008', 'perm-0051', NOW()
);
INSERT IGNORE INTO `sys_role_permission` VALUES (
'role-0008', 'perm-0052', NOW()
);
5. 为普通查看用户分配权限
-- 为数据查看员角色分配地图权限
INSERT IGNORE INTO `sys_role_permission` VALUES (
'role-0009', 'perm-0050', NOW()
);
-- 分配子菜单权限...
INSERT IGNORE INTO `sys_role_permission` VALUES (
'role-0009', 'perm-0051', NOW()
);
INSERT IGNORE INTO `sys_role_permission` VALUES (
'role-0009', 'perm-0052', NOW()
);
三、验证配置
提供了验证权限创建和角色权限分配的SQL查询语句。
文章最后提供
四、扩展配置(可选)
为地图模块添加按钮权限(导出设备分布、搜索事件)并分配给相应角色。
文字最后提供
五、完整SQL脚本
包含所有配置的完整SQL脚本,可直接执行。
六、后续操作
- 重启后端服务刷新权限缓存
- 用户重新登录获取最新权限
- 前端验证菜单显示
- 验证权限差异
这份文档提供了完整的配置步骤和SQL语句,您可以根据实际情况调整角色ID和权限参数。
全面的权限验证查询,涵盖「角色权限明细核对」「用户实际权限穿透查询」「权限分配完整性校验」等场景,方便快速验证权限创建和角色分配是否符合预期:
一、角色-权限明细查询(核心验证)
查看每个角色具体拥有哪些权限(含权限层级、类型、URL),直接核对权限分配是否正确:
-- 角色-权限明细清单(按租户、角色分组)
SELECT
t.`name` AS 租户名称,
r.code AS 角色编码,
r.`name` AS 角色名称,
p.parent_id AS 父权限ID,
p.code AS 权限编码,
p.`name` AS 权限名称,
p.resource_type AS 资源类型, -- MODULE/MENU/BUTTON
p.resource_url AS 权限URL,
p.resource_method AS 请求方式
FROM
sys_role r
JOIN sys_tenant t ON r.tenant_id = t.id
JOIN sys_role_permission rp ON r.id = rp.role_id
JOIN sys_permission p ON rp.permission_id = p.id
ORDER BY
t.id, r.id, p.parent_id, p.sort_order;
二、用户-角色-权限穿透查询(最终权限验证)
模拟用户登录后的实际权限范围,验证「用户→角色→权限」的穿透关系是否正确:
-- 单个用户的完整权限清单(以超级管理员为例,可替换username)
SELECT
u.username AS 用户名,
u.real_name AS 真实姓名,
t.`name` AS 所属租户,
r.`name` AS 角色名称,
p.code AS 权限编码,
p.`name` AS 权限名称,
p.resource_type AS 资源类型,
p.resource_url AS 访问URL
FROM
sys_user u
JOIN sys_tenant t ON u.tenant_id = t.id
JOIN sys_user_role ur ON u.id = ur.user_id
JOIN sys_role r ON ur.role_id = r.id
JOIN sys_role_permission rp ON r.id = rp.role_id
JOIN sys_permission p ON rp.permission_id = p.id
WHERE
u.username = 'superadmin' -- 可替换为其他用户(如analyst001、collector001)
ORDER BY
p.parent_id, p.sort_order;
-- 所有用户的权限数量统计(快速排查权限缺失)
SELECT
u.username AS 用户名,
u.real_name AS 真实姓名,
t.`name` AS 所属租户,
COUNT(DISTINCT p.id) AS 拥有权限总数
FROM
sys_user u
JOIN sys_tenant t ON u.tenant_id = t.id
JOIN sys_user_role ur ON u.id = ur.user_id
JOIN sys_role r ON ur.role_id = r.id
JOIN sys_role_permission rp ON r.id = rp.role_id
JOIN sys_permission p ON rp.permission_id = p.id
GROUP BY
u.id, u.username, u.real_name, t.`name`
ORDER BY
t.id, u.username;
三、权限分配完整性校验
验证是否存在「角色无权限」「权限未分配给任何角色」「用户无角色」等异常情况:
-- 1. 检查无权限的角色(正常应无结果,除非刻意配置空角色)
SELECT
r.code AS 角色编码,
r.`name` AS 角色名称,
t.`name` AS 租户名称
FROM
sys_role r
JOIN sys_tenant t ON r.tenant_id = t.id
LEFT JOIN sys_role_permission rp ON r.id = rp.role_id
WHERE
rp.permission_id IS NULL;
-- 2. 检查未分配给任何角色的权限(正常应无结果,除非冗余权限)
SELECT
p.code AS 权限编码,
p.`name` AS 权限名称,
p.resource_type AS 资源类型
FROM
sys_permission p
LEFT JOIN sys_role_permission rp ON p.id = rp.permission_id
WHERE
rp.role_id IS NULL;
-- 3. 检查无角色的用户(正常应无结果,所有用户都应分配角色)
SELECT
u.username AS 用户名,
u.real_name AS 真实姓名,
t.`name` AS 所属租户
FROM
sys_user u
JOIN sys_tenant t ON u.tenant_id = t.id
LEFT JOIN sys_user_role ur ON u.id = ur.user_id
WHERE
ur.role_id IS NULL;
四、按权限类型/模块统计(权限维度验证)
验证不同模块、不同类型(按钮/菜单/模块)的权限分配情况:
-- 按权限模块统计各角色的权限数量
SELECT
r.`name` AS 角色名称,
parent_p.`name` AS 权限模块, -- 顶层模块(如系统管理、碳数据管理)
COUNT(DISTINCT p.id) AS 模块下权限总数
FROM
sys_role r
JOIN sys_role_permission rp ON r.id = rp.role_id
JOIN sys_permission p ON rp.permission_id = p.id
JOIN sys_permission parent_p ON p.parent_id = parent_p.id -- 关联顶层模块
GROUP BY
r.id, r.`name`, parent_p.id, parent_p.`name`
ORDER BY
r.id, parent_p.sort_order;
-- 按资源类型(MODULE/MENU/BUTTON)统计权限分布
SELECT
p.resource_type AS 资源类型,
COUNT(DISTINCT p.id) AS 权限数量,
GROUP_CONCAT(DISTINCT p.code SEPARATOR ',') AS 权限编码示例
FROM
sys_permission p
GROUP BY
p.resource_type;
五、租户隔离权限验证(多租户场景核心)
验证不同租户的角色/权限是否隔离,避免跨租户权限泄漏:
-- 验证租户权限隔离(确保租户A的角色无法访问租户B的权限)
SELECT
t1.`name` AS 角色所属租户,
r.code AS 角色编码,
t2.`name` AS 权限所属租户,
p.code AS 权限编码
FROM
sys_role r
JOIN sys_tenant t1 ON r.tenant_id = t1.id
JOIN sys_role_permission rp ON r.id = rp.role_id
JOIN sys_permission p ON rp.permission_id = p.id
JOIN sys_tenant t2 ON p.tenant_id = t2.id
WHERE
t1.id != t2.id; -- 正常应无结果,若有结果则存在跨租户权限泄漏
使用说明:
- 执行初始化SQL后,直接运行上述查询即可验证;
- 重点关注「无权限角色」「未分配权限」「跨租户权限」查询,若返回结果则说明权限分配存在异常;
- 可通过修改
WHERE条件中的username「角色编码」等,针对性验证某个用户/角色的权限; - 结合初始化SQL中的「密码说明」,登录系统后可手动操作验证权限是否生效(如超级管理员能访问
/system/tenants,租户管理员不能访问)。
这些查询覆盖了权限体系的「创建完整性」「分配正确性」「隔离有效性」,能快速定位初始化过程中的权限相关问题。
1149

被折叠的 条评论
为什么被折叠?



