SpringBoot3Vue3Flowable 发起权限谁可以发起、菜单关联流程和兜底权限码怎么配文档地址https://ruoyioffice.com源码1·GitHubhttps://github.com/yuqing2026/ruoyi-office源码2·GitCodehttps://gitcode.com/zhouzhongyan/ruoyi-office源码3·Giteehttps://gitee.com/yqzy1688/ruoyi-office微信17156169080备注「RuoYi Office」用车单只想让行政发、请假单全员能发最常见的错法是再做一套「流程角色」和菜单 RBAC 各管各的。RuoYi Office 把发起权收到菜单「关联流程」大厅只列出当前人有权限的定义模型上的「谁可以发起」只收窄到人/部门「发起所需权限」是没有菜单入口时的兜底。配置体检把未绑菜单、孤儿权限码列出来。本文按能点的页面讲怎么配。▲ 左是发起大厅和工作台卡片中是模型「谁可以发起 / 发起所需权限」右是菜单关联流程 Key底下三条是孤儿码、组织收窄、required 开关引言发起权难在「两套名单」把「能进菜单」和「能发这个流程」配成两张表上线后一定打架痛点常见做法后果菜单有了大厅没有再维护一份发起白名单改角色要改两处漏一处就超权大厅有了点进去 403只滤列表不滤发起接口会改 URL 的人仍能发权限码写在模型上菜单里根本没有这个码除超管外全员拒绝无从排查未绑菜单的老流程一刀切禁止升级当天全公司发不了单指定部门却用主档部门忽略当前会话部门多组织切换后口径错一句话功能权限以菜单为唯一配置源组织范围只做收窄。模型上的权限码是兜底不是主路径。下面按能点的四处讲发起大厅、流程模型基本信息、菜单「关联流程」、系统管理里的配置体检。一、先给出可直接抽取的定义1.1 什么是发起权限发起权限是「当前登录人能不能创建该流程定义的实例」。它在两处生效发起列表大厅/工作台卡片和真正的发起接口。只滤列表、不滤接口等于没配。RuoYi Office 的判定入口是canUserStartProcessDefinition先过功能权限再过组织范围。功能权限关了bpm.start-permission.enabledfalse时行为回到「已发布且可见即可发」组织范围仍然生效。1.2 菜单反查和兜底权限码菜单反查用流程定义 Key 去菜单表找processDefinitionKey命中的菜单取出这些菜单上的 permission当前用户命中任意一个即可发。改菜单立刻生效不必重新发布流程。兜底权限码模型字段「发起所需权限」例如oa:car-apply-bill:create。只有反查不到任何菜单权限时才读它。帮助文案写得很直白流程表单请在表单设计配菜单并发布同步业务表单在菜单管理给创建按钮填「关联流程」仅无菜单入口时才在这里填。兜底码必须真实存在于菜单。写一个菜单里没有的字符串任何角色都命中不了等于除超管外全员拒绝。配置体检会把这种情况标成严重。1.3 谁可以发起谁可以发起是组织范围不是第二套功能权限。三个选项值含义存什么0 全员不额外限制人/部门名单空1 指定人员仅这些 userIdstartUserIds2 指定部门仅这些部门含当前会话部门startDeptIds名单为空表示不收窄。有人员名单时不再看部门名单。多组织开启后指定部门用的是会话当前deptId不是用户档案主档——切到长沙就不能再发「仅深圳研发可发」的单。它和候选人策略、发起人节点三策略不是一回事。后者管审批节点谁来批本篇只管能不能把单开出来。二、发起大厅列表已经按权限裁过路径/bpm/start-process。标题就是「发起流程」。卡片只出现当前账号能发的定义不是「库里所有已发布模型」。▲ 能看见的卡片点进去才应能提交看不见的不要靠改 URL 绕过接口会再判一次工作台应用中心的「发起流程」走进的是同一套大厅。不要把大厅页当成流程表单的父菜单——设计器会拦父菜单不能选「发起流程」大厅页请挂到「自定义申请」等业务目录。大厅是目录不是某张单的创建按钮。流程表单发布时可以自动生成菜单。生成后仍要把该菜单授给角色否则大厅和侧栏都不会出现。业务单据用车、用印则是在已有「创建」按钮上填关联流程 Key。三、流程模型基本信息里的两行配置路径/bpm/manager/model卡片墙按分类摆点「修改」进入四步向导第一步就是基本信息。改发起权不必先打开 BPMN 画布。滑到表单下半段能看到两行发起所需权限自动完成占位「如 oa:car-apply-bill:create一般留空」谁可以发起全员 / 指定人员 / 指定部门指定后出现选择器▲ 兜底权限码一般留空人员/部门选择器只在对应类型下出现保存并发布后这两项写入流程定义 Info 表。只保存不发布大厅仍按旧版本判权。复制模型会带上范围但权限码若是孤儿码复制后体检照样报。管理员名单managerUserIds管谁能改这个模型不管谁能发起。不要把「流程管理员」和「可发起人」配成同一组人——实施会改模型员工只发单。基本信息这一步还有「是否可见」。不可见的定义不会进大厅和发起权限是与关系可见且有权才能出现卡片。测试中的模型可以先关可见配完权限再打开避免员工在大厅里点到半成品。四步向导的后三步表单设计、流程设计、更多设置不参与canUserStartProcessDefinition。字段权限、候选人、超时策略都在后面配不要跑到那些页去找「谁可以发起」。四、菜单关联流程才是主配置源路径/system/menu。在创建按钮或菜单上点「编辑」不是列表顶上的「修改流程」页签。类型选按钮或菜单后表单下半会出现「关联流程」下拉选已发布定义的 Key可多选tags也可手输历史别名。保存成逗号分隔供发起权限反查。弹窗右侧有一块「影响面」配的时候盯着它改比改完再去大厅试更快影响面何时变成「会影响」配错时的原文PC 侧栏角色勾了这级菜单角色未勾则侧栏没有入口流程中心发起填了关联流程 Key「未关联流程 Key不会按本菜单控权」App 工作台可见端含 App 且有移动路径「可见端含 App但缺少移动路径」App 快捷打开了「可作快捷」未开启则不进快捷候选目录节点几乎一定显示「未关联流程 Key」——这是正常的不要给目录填 Key。只有真正的创建按钮影响面才会变成按本菜单 permission 判权。帮助语义填了 Key发起校验按本菜单的 permission 判权没填不会按本菜单控权可见端包含 App但既没移动路径也没关联流程App 工作台不会出现入口配置体检标黄列表「入口影响」列会给绑了流程的行打紫色「流程」标签方便扫一眼哪些按钮已经纳入发起权。改完点工具栏「清理菜单缓存」再用一个没有该按钮权限的账号刷新大厅卡片应消失。同一 Key 可以挂在多个菜单PC 创建、App 创建。反查时这些权限任一满足即可不是必须同时有。不要把同一 Key 挂到十个互不相关的按钮上体检会提示保留唯一发起入口。改菜单立即生效因为反查走菜单缓存。不必为了「收紧谁能发用车」去改 BPMN、不必重新部署流程。这是和「把权限码写死在模型里」最大的产品差异。字段只在菜单类型为「菜单」或「按钮」时出现。目录节点没有「关联流程」也不该把 Key 写在目录上——反查会把目录的 permission常常为空也算进去体检会出现「同一 Key 挂了多个入口」。4.1 流程表单和业务表单怎么配两类表单进同一套判定配法不同类型典型菜单从哪来关联流程谁填流程表单设计器里拖的请假、通用表单表单设计里勾菜单发布时同步同步应已带上 Key到菜单里核对一眼业务表单用车、用印、会议室本来就有「创建」按钮在该按钮上选手动填 Key无入口遗留流测试、一次性导入没有模型兜底码或接受未绑requiredfalse不要把业务表单的创建按钮删掉只靠发起大厅。侧栏没有入口实施会以为「菜单没配」其实大厅还能发——两边必须同一套权限。发布流程表单时设计器会拦父菜单不能选「发起流程」大厅页。正确挂法是挂到「OA / 自定义申请」这类业务目录。大厅是挑单目录不是某张单的父级。4.2 同一 Key 挂多个菜单PC 创建按钮、App 创建按钮、工作台快捷入口可以挂同一个 Key。反查取出这些菜单的 permissionhasAnyPermissions任一满足即可。不要理解成「必须同时拥有三个码」。反过来不要把同一个 Key 挂到十个互不相关的按钮上。配置体检会提示「流程被多个菜单关联」。保留一个真正的发起入口其余入口用路由跳转不要再写一遍 Key。菜单表单里这一项是可多选的流程定义下拉保存成逗号分隔的 Key供发起权限反查{fieldName:processDefinitionKey,label:关联流程,component:ApiSelect,componentProps:{api:getSimpleProcessDefinitionList,labelField:name,valueField:key,mode:tags,allowClear:true,showSearch:true,placeholder:下拉选择或回车输入流程 Key,},help:可多选支持手输历史别名 Key。保存为逗号分隔用于流程中心发起权限反查,}只在类型为按钮或菜单时显示。目录节点看不到这一项也不要靠改库把 Key 写到目录行上。五、配置体检未绑、孤儿码、死链路径/system/permission-audit。页顶 Alert 汇总严重/提示条数表格可按全部 / 严重 / 提示筛选。行内「去修复」跳菜单或模型。▲ 清零严重项之前不要把 required 打开打开后未绑流程含超管也发不了体检主要看三类编码含义级别现场建议流程未绑权限提示或严重反查不到菜单模型权限码也空在真实发起入口填关联流程孤儿 start_permission严重模型填了菜单里不存在的码改到菜单关联并清空模型兜底菜单 Key 未部署严重菜单写了 Key没有启用版本核对 Key 或去模型发布未绑在requiredfalse默认时是提示当前所有人都可以发。requiredtrue时变严重任何人含超管都无法发起。升级过渡务必保持默认把未绑清零后再收紧。测试表单、无入口遗留流可以忽略。不要为了「体检全绿」把演示用的测试流程全禁掉。六、两道部署开关写成配置项不要和租户开关搞混项默认作用bpm.start-permission.enabledtruefalse 时不按菜单/兜底码过滤恢复升级前「已发布且可见即可发」bpm.start-permission.requiredfalse仅 enabledtrue 时有意义true 则未绑流程一律禁止组织范围不受 enabled 影响关掉功能权限过滤后指定人员/部门仍然生效。这是有意的——客户可以先关菜单反查做兼容但「只有行政能发用车」这种范围仍要管。工作台也能看到发起入口。权限裁剪后卡片变少不是首页坏了。▲ 发起是权限裁过的卡片铃铛是站内信/IM 未读下一篇专门讲不要和发起大厅混七、后端判定顺序publicbooleancanUserStartProcessDefinition(BpmProcessDefinitionInfoDOdef,LonguserId){if(defnull){returnfalse;}if(isStartPermissionEnabled()!checkStartPermission(def,userId)){returnfalse;}if(CollUtil.isNotEmpty(def.getStartUserIds())){returndef.getStartUserIds().contains(userId);}if(CollUtil.isNotEmpty(def.getStartDeptIds())){AdminUserRespDTOuseradminUserApi.getUser(userId).getCheckedData();LongdeptIduser!null?user.getDeptId():null;if(Objects.equals(userId,SecurityFrameworkUtils.getLoginUserId())SecurityFrameworkUtils.getLoginUserDeptId()!null){deptIdSecurityFrameworkUtils.getLoginUserDeptId();}returndeptId!nulldef.getStartDeptIds().contains(deptId);}returntrue;}要点人员名单优先于部门名单当前请求若已 overlay 会话部门指定部门用会话值。功能权限失败直接 false不会再看组织范围——没有创建按钮的人即使在指定部门里也发不了。功能权限内部再分三步ListStringpermissionsmenuApi.getPermissionListByProcessDefinitionKey(key).getCheckedData();if(CollUtil.isNotEmpty(permissions)){returnpermissionApi.hasAnyPermissions(userId,permissions.toArray(newString[0])).getCheckedData();}StringpermissionprocessDefinition.getStartPermission();if(StrUtil.isBlank(permission)){returnhandleUnboundProcess(processDefinition,未关联菜单且未配置兜底);}if(CollUtil.isEmpty(menuApi.getMenuIdListByPermission(permission).getCheckedData())){returnhandleUnboundProcess(processDefinition,兜底码不在菜单中);}returnpermissionApi.hasAnyPermissions(userId,permission).getCheckedData();handleUnboundProcess在 requiredfalse 时打 warn 后返回 true保证存量requiredtrue 返回 false。孤儿码先按「不在菜单中」走进未管控分支体检则单独标严重避免实施以为「码写了就生效」。流程 Key 解析优先走引擎ProcessDefinition.getKey()。历史上有的部署把定义 ID 写成纯 UUID截取冒号前一段会得到整段 UUID菜单 FIND_IN_SET 命中失败。不要自己id.split(:)[0]当 Key 去配菜单。前端基本信息里权限码是自动完成选项来自全量菜单的permission去重聚焦输入框才去拉避免一进页就打菜单列表。占位写得很清楚一般留空。Form.Item label发起所需权限namestartPermissionAutoComplete v-model:valuemodelData.startPermission:optionspermissionOptionsplaceholder如 oa:car-apply-bill:create一般留空allow-clearfocusensurePermissionOptions//Form.Item「谁可以发起」切到指定人员时出现头像选择器切到指定部门时出现部门树。切回全员会清空已选名单保存前看一眼避免「界面显示全员、库里还留着旧 userId」。7.1 大厅为什么已经是裁过的发起大厅和工作台「发起流程」卡片走的不是「查出所有已发布定义再在浏览器里藏」。后端在组装列表时对每条定义调用同一套canUserStartProcessDefinition。所以角色被收回创建权限后刷新大厅卡片应立刻消失指定人员改成别人并发布后自己的大厅不再出现该卡片只保存不发布大厅仍按上一版 Info 判可见性visiblefalse的定义不会进大厅这是另一条过滤和发起权限是与关系不可见的流程有权限也看不到。八、数据落在哪位置字段谁改菜单表process_definition_key、permission菜单管理 / 流程表单发布同步定义 Infostart_permission、start_user_ids、start_dept_ids模型基本信息发布配置enabled / required部署文件缓存process_key_permissions:{key}改菜单后失效不要为发起权再新建「流程角色表」。角色已经通过菜单 permission 作用到人。再加一张表配置体检无法闭环。Info 表和菜单表的职责可以记成一张对照要改的行为改哪张表 / 哪一页要不要发布流程哪些角色能看见创建按钮角色管理勾菜单否这个创建按钮对应哪个流程菜单「关联流程」否只有这几个人 / 这几个部门能发模型「谁可以发起」是写进定义 Info没有菜单的例外流程模型「发起所需权限」是升级兼容还是收紧未绑bpm.start-permission.*否改配置重启有没有配错配置体检否「要不要发布」这一列最容易漏改组织范围却只点了保存大厅还按上一版 Info 放行实施会以为指定人员没生效。九、和相邻能力划界能力管什么不要用来菜单 RBAC侧栏/按钮/发起功能权限指定「只有这三个人」——用谁可以发起谁可以发起人/部门收窄替代创建按钮权限发起人节点策略第一个审批节点要不要跳过发起人控制大厅卡片节点字段权限审批时字段四态控制能不能提交数据权限列表能看哪些已有单据控制能不能新建把「销售不能发用车」配成数据权限「本部门」是错的新建时还没有部门行可过滤。应去掉销售角色上的用车创建权限或把用车发起范围指定到行政部。9.1 四类常见错配现场根因怎么修大厅没有用车侧栏有创建创建按钮没填关联流程大厅按菜单反查不到在创建按钮填 Keyoa_car_apply_bill大厅有用车提交报没权限列表缓存了旧结果或打开的是旧页签里的定义刷新大厅确认模型已发布所有人都发不了模型明明写了码码是菜单里不存在的字符串体检「孤儿码」→ 改到真实 permission 或清空兜底切到长沙后还能发「仅深圳」的单指定部门用了档案主档开多组织后判定读会话deptId切过去再试App 工作台还有一条独立规则菜单声明了 App 可见但既没填移动路径、也没关联流程体检标黄App 不会出现制单入口。PC 大厅不受这条影响。配移动端时三条一起看可见端、移动路径、关联流程。缓存键按流程 Key 存权限列表。改菜单「关联流程」或 permission 后应失效页面上有「清理菜单缓存」。改完角色授权用户要重新拉菜单退出或刷新否则侧栏还显示旧按钮大厅已经按新权限裁了两边看起来不一致。十、设计对照决策点错法本方案理由权限写哪模型上随便填一个码菜单关联 Key 反查改角色立即生效无菜单老流程升级当天全禁required 默认 false 放行存量能发大厅父菜单挂在发起大厅下禁止挂业务目录大厅是目录不是按钮指定部门只用档案部门会话 deptId 优先多组织口径一致接口只滤大厅发起接口再判防改 URL体检出了问题再查日志未绑/孤儿/死链一张表实施可修十一、技术亮点设计要点实现方式价值菜单唯一配置源Key 反查 permission 列表和侧栏同一套角色兜底码校验存在性按 permission 反查菜单 id避免幽灵码双开关enabled / required升级可兼容、可收紧组织收窄startUserIds 优先于 startDeptIds产品只露出「谁可以发起」会话部门LoginUser deptId overlay多组织切完立刻生效配置体检/bpm/process-definition/permission-audit未绑和孤儿码可见发布才生效Info 随定义版本草稿改范围不影响在途大厅任一菜单即可hasAnyPermissionsPC/App 两个创建按钮不互斥十二、FAQQ1模型里填了发起所需权限菜单也关联了以谁为准菜单反查优先。只要反查到任意权限码模型兜底字段被忽略。Q2超管是不是永远能发功能权限上超管通常命中所有 permission。但 requiredtrue 且流程完全未绑时判定走「未管控禁止」超管也发不了。先体检清零再开 required。Q3指定部门后兼职人员切到该部门能不能发能。判定用当前会话部门。没切过去时即使档案挂过这个部门也不算。Q4大厅看得见提交报没权限列表和接口应用同一套canUserStartProcessDefinition。若仍发生多半是发布后权限变了、或打开的是旧页签里的已选定义。刷新大厅再发。Q5流程表单发布同步的菜单要不要再填关联流程同步时应已带上 Key。到菜单里核对一眼即可不必在模型兜底再写一遍同一个码。Q6enabledfalse 后指定人员还管不管用管。enabled 只关菜单/兜底功能权限组织范围仍过滤。Q7复制模型会不会把发起范围带过去会带上人员/部门名单和兜底码。若原模型是孤儿码复制后体检照样报。复制后先清兜底再给新 Key 配自己的菜单。Q8流程管理员能发单吗managerUserIds管谁能改这个模型不管谁能发起。实施账号和员工账号应分开实施改模型员工只发单。Q9和「用户多组织」是什么关系指定部门用的是当前会话部门。多组织关掉时会话部门就是档案主档打开后顶栏切到长沙用车若指定「仅深圳研发」大厅卡片应消失。不要在发起权限里再存一份「兼职部门名单」。Q10配置体检 300 多条提示要不要当天清零不必。提示里大量是测试表单未绑、App 可见但没移动路径。先滤「严重」孤儿码、菜单 Key 未发布、required 打开后的未绑。提示可以列入迭代不要当成发布门禁。十三、快速体验在线演示https://ruoyioffice.com/web/账号 admin / admin123建议路径流程中心 → 发起流程看当前账号有哪些卡片流程中心 → 流程模型 → 任选一个点修改看「谁可以发起」「发起所需权限」系统管理 → 菜单管理搜业务创建按钮看「关联流程」系统管理 → 菜单配置体检看未绑/孤儿/死链不要在未清零时打开 required可选把某流程改成指定人员为自己以外的人发布后大厅卡片应消失工作台应用中心点「发起流程」确认和大厅是同一套裁剪常见验收失败对照上面 16第 1 步卡片很多、第 3 步创建按钮没 Key大厅可能靠 requiredfalse 放行上线一收紧就全没了第 2 步改了指定人员但第 1 步没变只点了保存没发布第 4 步严重项里有「用车申请单创建」指向未发布 Key菜单 Key 和模型标识不一致先对一下oa_car_apply_bill实施清单检查项通过标准每个正式流程有且宜少的发起菜单体检无「未绑」严重项模型兜底码为空或能在菜单中搜到无孤儿码谁可以发起与业务一致全员或指定人/部门不要和角色重复造名单required 仍为 false除非未绑已清零发起接口与大厅一致改 URL 不能绕过工作台发起卡片与大厅一致同一套裁剪不是第二份白名单App 制单入口可见端含 App 时同时有移动路径和关联流程升级当天建议按这个顺序动刀先跑配置体检把「菜单指向的流程未发布」和孤儿码修掉未绑项先挂上真实创建按钮组织范围指定人员/部门最后收。不要一上来把bpm.start-permission.required打开——那会让还没来得及绑菜单的存量流程全员含超管发不了。SIMPLE 和 BPMN 两种画布共用 Info 表里的这两行配置。换设计器类型不会丢掉「谁可以发起」。可见性、管理员名单、允许撤销是旁边的字段保存时一起提交但判定发起时不会读它们。源码仓库GitHubhttps://github.com/yuqing2026/ruoyi-office GitCodehttps://gitcode.com/zhouzhongyan/ruoyi-office Giteehttps://gitee.com/yqzy1688/ruoyi-office结语发起权不该成为「流程模块自己的 RBAC」。菜单关联流程 Key角色勾按钮大厅和接口共用一次判定谁可以发起只回答「这些人/这些部门」兜底权限码留给没有菜单的特例并且必须能在菜单里找到。配置体检把未绑和孤儿码摊在一张表上升级才敢把 required 打开。同一套「菜单为源、范围为收窄」还可以用在移动端制单入口App 可见 移动路径 关联流程缺一不可体检同样会标黄。配置体检页顶的 Alert 会直接写出start-permission.required打开后的后果。把它当成上线检查清单而不是出了 P0 再翻日志。大厅、模型、菜单、体检这四页走完发起权就不再是「流程模块自己的第二套 RBAC」。菜单编辑弹窗右侧有一块「影响面」会告诉你这条菜单会不会进 PC 侧栏、会不会按本菜单控发起权、App 工作台缺不缺移动路径。目录节点几乎一定显示「未关联流程 Key不会按本菜单控权」——这是正常的不要给目录填 Key。只有真正的创建按钮或菜单影响面才会变成「按本菜单 permission 判权」。配完保存后到发起大厅用一个没有该按钮权限的账号验证卡片消失比只看体检绿勾更准。实施排期上把「绑菜单」和「收组织范围」拆成两次发布第一次只让大厅和侧栏对齐第二次再指定人员或部门。两次都走配置体检比一次改三处更容易回滚。想要体验 RuoYi Office 的强大功能在线演示https://ruoyioffice.com/web/账号 admin / admin123源码仓库GitHubhttps://github.com/yuqing2026/ruoyi-office GitCodehttps://gitcode.com/zhouzhongyan/ruoyi-office Giteehttps://gitee.com/yqzy1688/ruoyi-office技术咨询添加微信17156169080备注「RuoYi Office」⭐如果觉得不错请给个 Star 支持一下
