从菜单到数据权限:Jeesite权限管理全方位实战指南
一、权限管理体系概览
Jeesite作为Java快速开发平台,采用Spring Boot+Apache Shiro的权限架构,实现从页面菜单到数据行级的立体化权限控制。核心权限模块位于packages/core/目录,通过RBAC(基于角色的访问控制)模型,支持组织、角色、用户三级权限分配,覆盖功能权限、按钮权限、数据权限等维度。
权限控制流程如下:
二、菜单权限控制
2.1 路由权限动态生成
系统通过packages/core/store/modules/permission.ts中的buildRoutesAction方法,根据用户角色动态构建可访问路由。支持三种权限模式:
- 角色模式(ROLE):基于角色过滤路由
- 路由映射模式(ROUTE_MAPPING):路由与菜单联动控制
- 后端模式(BACK):完全由后端接口返回路由数据
核心代码实现:
// 权限模式判断逻辑
switch (permissionMode) {
case PermissionModeEnum.ROLE:
routes = filter(asyncRoutes, routeFilter);
routes = flatMultiLevelRoutes(routes);
break;
case PermissionModeEnum.BACK:
routeList = (await menuRouteApi()) as AppRouteRecordRaw[];
routeList = transformObjToRoute(routeList);
routes = [...asyncRoutes, ...routeList];
break;
}
2.2 菜单展示控制
前端菜单渲染基于权限过滤后的路由数据,通过packages/core/router/helper/menuHelper.ts的transformRouteToMenu方法转换为菜单结构。菜单图标使用packages/assets/icons/目录下的SVG资源,支持明暗主题切换。
三、按钮级权限控制
3.1 权限指令实现
系统提供v-auth自定义指令实现按钮级权限控制,定义于packages/core/directives/permission.ts:
// 权限检查逻辑
function isAuth(el: Element, binding: any) {
const { hasPermission } = usePermission();
const value = binding.value;
if (!value) return;
if (!hasPermission(value)) {
el.parentNode?.removeChild(el);
}
}
3.2 使用示例
在Vue组件中通过指令控制按钮显示:
<template>
<button v-auth="['sys:user:add']">新增用户</button>
<button v-auth="['sys:user:edit']">编辑用户</button>
</template>
权限码格式采用:分隔的三级结构,对应模块:功能:操作。
四、数据权限控制
4.1 权限码存储与校验
用户权限码列表存储在PermissionStore中,通过packages/core/store/modules/permission.ts的setPermCodeList方法保存。权限校验通过hasPermission方法实现,支持多权限逻辑判断。
4.2 数据行级过滤
后端通过Shiro的过滤器链和自定义数据权限注解,实现SQL层面的数据权限过滤。核心原理是在SQL执行时动态添加数据权限条件,如:
-- 数据权限过滤示例
SELECT * FROM sys_user
WHERE org_code IN (
SELECT org_code FROM sys_role_data WHERE role_id = #{currentRoleId}
)
五、权限管理最佳实践
5.1 权限设计原则
- 最小权限原则:仅授予用户完成工作所需的最小权限
- 职责分离原则:关键操作需多角色协作完成
- 权限定期审计:通过packages/core/views/sys/下的权限审计功能定期检查权限分配
5.2 常见问题解决
- 权限不生效:检查权限码是否正确、用户角色是否分配
- 菜单不显示:确认路由配置的
meta.roles属性与用户角色匹配 - 数据权限异常:检查数据权限过滤器配置及SQL拦截器
六、权限配置界面
系统提供可视化权限配置界面,位于系统管理模块下:
- 用户管理:packages/core/views/sys/user/
- 角色管理:packages/core/views/sys/role/
- 菜单管理:packages/core/views/sys/menu/
配置界面支持拖拽排序、批量操作,权限分配采用树形结构展示,直观易用。
七、总结
Jeesite权限管理系统通过前后端协同,实现了从菜单到数据的全链路权限控制。核心实现基于packages/core/模块,采用RBAC模型和指令式权限控制,兼顾安全性与易用性。开发人员可通过扩展权限码体系和数据权限过滤器,满足复杂业务场景的权限需求。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



