一句话
列表批量操作条的按钮无法按权限集显隐,而卡点只在 spec 的 BulkActionDefSchema 少了 requiredPermissions 键 —— console 的批量条渲染层本来就在按这个键过滤,和行动作用的是同一套。
三点实测(17.0.0-rc.5)
① 声明侧堵死
视图 bulkActionDefs 里内联写 requiredPermissions,compile 硬失败(不是静默剥离):
Unrecognized key(s) on this bulk action definition: `requiredPermissions`.
Until #4457 the whole array was z.array(z.record(z.string(), z.any())) —
every key parsed, so a mis-spelled one shipped as a button that silently
ran the DEFAULT behaviour (or none at all).
BulkActionDefSchema 顶层键实测:
name / label / icon / variant / operation / execution / patch / params /
confirmText / confirmLabel / visible / maxRecords / batchSize / condition / style
(严格化本身是好事 —— #4457 那个动机完全成立。只是这一版把 requiredPermissions 漏掉了。)
② 渲染侧其实已经支持
@objectstack/console plugin-grid,批量条组件与行动作组件是同一套过滤:
// 批量条
const p = useMemo(() => (actionDefs ?? []).filter(e => f(e?.requiredPermissions)), [actionDefs, f]);
// 行动作(同一文件,同一个 hook)
const h = useMemo(() => (rowActionDefs ?? []).filter(e => m(e?.requiredPermissions)), [rowActionDefs, m]);
能力门的代码就在那儿,只是没有合法的声明能喂给它。
③ 换声明位置能绕过去,而且确实生效
把按钮定义成对象 actions[](那里 requiredPermissions 合法),视图 bulkActionDefs 只写 { name, operation: 'custom', execution: 'aggregate' } 同名引用 —— 合并函数会把 requiredPermissions 原样带进 bulk def。
真机实测(设备列表,admin 勾 1 行):
| 按钮 |
requiredPermissions |
admin 看到 |
| 批量导出二维码 |
无 |
✅ 显示 |
| 探针 A |
无 |
✅ 显示 |
| 探针 B |
['<一个不存在的能力>'] |
❌ 被挡掉 |
⇒ 门确实生效,admin 也不豁免(与导航项 requiredPermissions 同语义)。
为什么绕法不够用
该合并路径要求 operation === 'custom' && execution === 'aggregate',operation 随后被写死成 custom。也就是说:
- 要能力门 → 按钮必须是 custom 动作,自己调接口按
_selectedIds 处理
- 要
operation: 'update' + patch 的声明式批量改字段 → 只能内联,没有能力门
二选一。我们这边四个批量按钮(批量设置责任人 / 下推 / 转派 / 批量删除)全是声明式 update 写法,为了加个显隐门要把三条已经稳定的批量写链路整体重写 + 重测 —— 收益/风险倒挂,所以没做。
期望
给 BulkActionDefSchema 加一个可选的 requiredPermissions?: string[]。渲染层不用动。
这样声明式批量更新和能力门就能同时拥有,现有的 def 各加一行即可。
实际影响
排班计划列表的 4 个批量按钮对所有能进该列表的人全部可见,无权者点下去才被服务端 hook 逐条拒。用户反馈的就是这个体验 —— 「看得见一堆跟自己无关的操作,点了才知道不行」。
版本
@objectstack/* 17.0.0-rc.5
一句话
列表批量操作条的按钮无法按权限集显隐,而卡点只在 spec 的
BulkActionDefSchema少了requiredPermissions键 —— console 的批量条渲染层本来就在按这个键过滤,和行动作用的是同一套。三点实测(
17.0.0-rc.5)① 声明侧堵死
视图
bulkActionDefs里内联写requiredPermissions,compile 硬失败(不是静默剥离):BulkActionDefSchema顶层键实测:(严格化本身是好事 —— #4457 那个动机完全成立。只是这一版把
requiredPermissions漏掉了。)② 渲染侧其实已经支持
@objectstack/consoleplugin-grid,批量条组件与行动作组件是同一套过滤:能力门的代码就在那儿,只是没有合法的声明能喂给它。
③ 换声明位置能绕过去,而且确实生效
把按钮定义成对象
actions[](那里requiredPermissions合法),视图bulkActionDefs只写{ name, operation: 'custom', execution: 'aggregate' }同名引用 —— 合并函数会把requiredPermissions原样带进 bulk def。真机实测(设备列表,admin 勾 1 行):
['<一个不存在的能力>']⇒ 门确实生效,admin 也不豁免(与导航项
requiredPermissions同语义)。为什么绕法不够用
该合并路径要求
operation === 'custom' && execution === 'aggregate',operation随后被写死成custom。也就是说:_selectedIds处理operation: 'update' + patch的声明式批量改字段 → 只能内联,没有能力门二选一。我们这边四个批量按钮(批量设置责任人 / 下推 / 转派 / 批量删除)全是声明式 update 写法,为了加个显隐门要把三条已经稳定的批量写链路整体重写 + 重测 —— 收益/风险倒挂,所以没做。
期望
给
BulkActionDefSchema加一个可选的requiredPermissions?: string[]。渲染层不用动。这样声明式批量更新和能力门就能同时拥有,现有的 def 各加一行即可。
实际影响
排班计划列表的 4 个批量按钮对所有能进该列表的人全部可见,无权者点下去才被服务端 hook 逐条拒。用户反馈的就是这个体验 —— 「看得见一堆跟自己无关的操作,点了才知道不行」。
版本
@objectstack/*17.0.0-rc.5