跳到主要内容

大屏、积木报表按钮权限说明

本文介绍积木报表(报表设计器)与大屏/仪表盘(drag)的按钮级权限控制

  • 该能力从 v2.3.4+ 开始支持,基于后端 @RequiresRoles(角色)/ @RequiresPermissions(权限编码)注解,前端据此控制按钮、右键菜单的显隐。
  • 角色与权限编码统一通过你实现的 JmReportTokenServiceI 扩展类提供,集成原理与 集成积木权限 一致。

一、整体原理

按钮权限是在原有「接口鉴权」基础上,把当前用户的角色权限编码下发到前端,用于控制按钮与右键菜单的显隐,做到「前端不显示、后端也拦截」的双重保护。

角色和权限编码是 「或」(OR) 的关系——命中任意一个即放行:

维度说明
角色(roles)命中按钮/接口声明的任意一个角色即放行;内置角色 adminlowdeveloperdbadeveloper,其中 admin 放行所有按钮
权限编码(perms)命中按钮/接口声明的任意一个权限编码即放行
二者关系同时声明角色与权限编码时,满足其一即放行(角色命中 权限编码命中);同一维度内多个值之间也是「或」

按钮隐藏只是「眼不见」,真正的安全由后端注解保证。请勿仅依赖前端隐藏。

效果对比(有权限 / 无权限)

以报表设计器列表页左侧菜单为例:未授予对应权限编码(且无命中角色)时,相关入口会自动隐藏。下图中「定时导出」(jmreport:exportJob:list)、「报表组合」(jmreport:reportGroup:list)在无权限时不再显示。

有权限无权限
有权限无权限

二、配置入口:实现 Token 扩展类

角色与权限编码均来自你实现的 JmReportTokenServiceI。如果不实现,积木会打印告警并放行(存在风险),因此生产环境必须实现

@Component
public class JimuReportTokenService implements JmReportTokenServiceI {

/**
* 返回当前用户的角色编码
* 积木内置三个角色:admin、lowdeveloper、dbadeveloper(admin 放行所有按钮)
*/
@Override
public String[] getRoles(String token) {
// 从你的权限体系(如 jeecgboot 的 sys_role)中取出当前用户角色
return new String[]{"lowdeveloper"};
}

/**
* 返回当前用户的按钮权限编码
*/
@Override
public String[] getPermissions(String token) {
// 从你的权限体系(如 jeecgboot 的 sys_permission)中取出当前用户的权限编码
return new String[]{"jmreport:category:add", "jmreport:category:edit"};
}

// ... getUsername / verifyToken 等其他方法
}

与 jeecgboot 集成时,getRoles / getPermissions 直接返回 jeecgboot 当前登录用户的角色编码和菜单按钮权限编码即可,无需额外维护。角色命中或权限编码命中,二者满足其一即可放行。

三、积木报表(报表设计器)按钮权限编码

报表设计器列表页(/jmreport/list)支持以下权限编码,可按需分配给角色:

权限编码功能
jmreport:category:add新增分类/文件夹
jmreport:category:edit编辑分类
jmreport:category:delete删除分类(移入回收站)
jmreport:category:reduction回收站还原
jmreport:category:completelyDelete彻底删除 / 清空回收站
jmreport:category:batchMove批量移动
jmreport:category:folderSort文件夹排序
jmreport:reportGroup:list报表分组-列表
jmreport:reportGroup:detail报表分组-详情
jmreport:reportGroup:save报表分组-保存
jmreport:reportGroup:delete报表分组-删除
jmreport:exportJob:list导出任务-列表
jmreport:exportJob:save导出任务-保存
jmreport:exportJob:detail导出任务-详情
jmreport:exportJob:delete导出任务-删除
jmreport:exportJob:run导出任务-执行
jmreport:exportJob:status导出任务-状态切换
jmreport:exportJob:plugin导出任务-插件
jmreport:map:add地图-新增
jmreport:map:delete地图-删除
jmreport:design:loadTableData预览数据(SQL数据集下浏览数据功能)

例如,给某角色只分配 jmreport:category:addjmreport:category:edit,该角色在列表页就只能看到「新增分类」「编辑分类」按钮,删除、彻底删除、批量移动等按钮会被隐藏;同时对应的后端接口也会拦截无权限请求。

四、大屏 / 仪表盘(drag)按钮权限编码

大屏与仪表盘模块(/drag/list)采用完全相同的机制:后端控制器方法上声明 @RequiresRoles / @RequiresPermissions,前端据此控制按钮与右键菜单显隐,角色与权限编码同样是「或」的关系,判定规则与上文一致。

常见的 drag 权限编码示例(来自内置默认列表):

权限编码功能
drag:datasource:testConnection数据源连接测试
drag:datasource:saveOrUpdate数据源新增/编辑
drag:datasource:delete数据源删除
drag:dataset:save数据集保存
drag:dataset:delete数据集删除
drag:analysis:sqlSQL 解析
drag:design:getTotalData对 Online 表单展示数据
onl:drag:clear:recovery清空回收站
onl:drag:page:delete页面(大屏/仪表盘)删除

以上为内置默认列表中的示例编码,实际生效的编码以大屏模块各控制器上 @RequiresPermissions 注解声明为准。分配权限时请保持编码与注解完全一致(区分大小写)。

五、常见问题

Q:分配了权限,按钮还是不显示?

  • 确认 getPermissions 真实返回了对应编码,且与按钮/注解声明的编码完全一致(区分大小写、冒号分隔);
  • 或给当前用户分配命中的角色(角色与权限编码是「或」的关系,命中其一即放行;admin 放行所有);
  • 确认已实现 JmReportTokenServiceI,否则空角色/空权限会被当作「无权限」隐藏按钮。

Q:操作时提示「没有权限,请联系管理员分配权限!」?

  • 这是后端注解拦截返回的提示,说明该接口需要对应角色或权限编码,给当前用户补充相应角色或编码即可。

Q:只想前端隐藏、后端不拦截可以吗?

  • 不建议。前端隐藏只是体验层,后端注解才是安全边界,二者使用同一套编码,保持一致即可。