Skip to content

配置行级数据权限 ​

一句话:把「销售只能看自己的客户」这类需求真正落地——从数据集资源、行过滤规则、角色授权一路配到登录验证,端到端走完一遍。读完约 20 分钟,全程只用四个页面。

演示环境里已经有成品,先看效果再动手

角色 doc_sales(成员 docsales)对在线表单「校验示例4-唯一性长度与脱敏」的 7 条授权,就是本篇的成品状态。你可以现在就用 docsales / admin123 登录,打开 基础设施 → 在线示例 → 校验示例4-唯一性长度与脱敏,看到的就是第 5 步里的受限视角;再照下面六步在自己租户里复刻一遍。

三层各管什么 ​

「数据权限」在本平台是三层独立配置,落在界面上是三种完全不同的现象。配之前先对号入座,否则会出现「明明拒了,列还在」这类困惑:

层由什么配置决定界面上的现象
行级数据集资源的授权行上挂「行过滤规则」列表行数变少;按编号直查别人的行报「数据不存在」
列级「列」子资源(权限标识带 :col:)的效果 = 拒绝列表里整列消失,行数据里连这个键都没有
字段级「字段」子资源(权限标识带 :fld:)的效果与字段模式新增/编辑表单里该字段整行消失;或输入框置灰只读,改了也写不进去

三层可以叠在同一个页面上——本教程就把三种都配在「校验示例4」这一张表单上。

列表里的 137****9001 是脱敏,不是权限

掩码来自表单字段自己的「脱敏策略」配置(见表单运行时),对所有人一视同仁;权限才分人。本篇截图里手机/证件号/账号带星号,是脱敏在起作用,别把它当成字段级权限的效果。

功能在哪 ​

页面路由本教程用它干什么
权限资源/system/org-permission/perm/resource确认数据集资源存在、看槽位映射(规则参数落到哪个物理列)
权限规则/system/org-permission/perm/rule选一条行过滤规则(或新建自定义的)
角色资源授权/system/role/grant?roleId=<角色编号>把「资源 + 动作 + 效果 + 规则 + 字段模式」挂到角色上
权限诊断/system/org-permission/perm/diag复核「某人到底有没有这个权限、命中的是哪条授权」

业务验证则直接在目标表单页(本例是在线表单运行时页)登录两个账号对照看。

常用操作 ​

第 1 步:确认数据集资源与槽位映射 ​

行过滤规则里的 {owner} 是个槽位,要靠数据集的「槽位映射」落到物理列(本例 owner → creator)。没这一步,规则求不出条件,整张表会一行都查不出来。

  1. 打开 系统管理 → 组织权限 → 权限管理 → 权限资源;
  2. 查询区「权限标识」填 test_demo_verify_supplier,点「搜索」——会列出这个数据集和它的操作/列/字段子资源;
  3. 在「类型 = 数据集」那一行点「明细设计」;
  4. 弹窗里先看头部:类型「数据集」、默认效果「允许」(这决定了「没配授权时」的兜底口径);
  5. 切到「槽位映射」页签,确认有 owner → creator 这一行;「授权列表」页签则能反查这张表已经授给了哪些角色。

明细设计:数据集头部(默认效果=允许)+ 授权列表页签,背后是搜索出的列/字段子资源(租户管理员视角)

缺 owner 槽位的数据集,挂「仅自己的数据」= 整表查不出来

规则求值时找不到槽位对应的列,ALLOW 条件退化为「恒假」,结果是一行都不返回,而且不报任何错。配规则前先在这一步把槽位看明白。

第 2 步:选一条行过滤规则 ​

  1. 打开 权限规则;
  2. 内置规则里「仅自己的数据」就是本教程要用的:行内点「查看」,只读弹窗会显示模板说明与它需要的槽位;
  3. 确认「模板说明」里写着「需要资源已配置槽位:owner」——与第 1 步对上;
  4. 「规则描述」{owner} = :currentUser 就是它的口径:只看创建人是当前登录用户的行。

查看内置规则「仅自己的数据」:模板说明点名需要 owner 槽位(租户管理员视角)

规则只是定义,不绑主体不生效

到这一步为止没有任何人的可见范围发生变化。规则要被角色资源授权的授权行引用后,才真正参与过滤。需要「只看本部门」「状态在某集合内」等口径,选对应内置模板或自建自定义规则,步骤相同。

第 3 步:给角色挂上行级授权 ​

  1. 打开 系统管理 → 组织权限 → 角色管理,在 doc_sales(文档-行级权限销售)行点「资源授权」;
  2. 点「新增授权」,右侧滑出非模态抽屉;
  3. 左侧资源树勾「显示字段级资源」,搜索 test_demo_verify_supplier,点选数据集本体(不是子资源);
  4. 「动作」选 查看,「效果」选 允许;
  5. 「行过滤规则」下拉选 仅自己的数据;
  6. 点「确定」。列表多出一行:效果「允许」、行过滤规则「仅自己的数据」。

下图是成品状态:查询区按权限标识过滤后,这个角色在这张表单上共 7 条授权——第 4 行是刚配的行级授权,第 1/3 行是列级/字段级拒绝,第 2 行是字段级只读。

角色 doc_sales 的 7 条授权:行过滤规则列挂着「仅自己的数据」,字段模式列挂着「只读」(租户管理员视角)

行内点「编辑」可以回看这条授权是怎么填的——抽屉里资源、动作、效果、规则四件套一目了然:

编辑授权抽屉:数据集 + 查看 + 允许 + 行过滤规则「仅自己的数据」(抽屉穿透,背后列表仍可见)

一条数据集级「查看/允许」会沿资源链放行整棵子树

决策是沿链继承的:命中祖先资源的授权也算命中。所以只配第 3 步这一条,docsales 在这张表单上的查询/新增/修改/删除按钮就全亮了(子资源自己的默认效果是拒绝,但链上祖先的允许先命中)。想禁掉某个按钮,要给对应的操作子资源(如 ...:delete)显式加一条拒绝——同链上「拒绝」优先于「允许」。本教程刻意保留这个状态,第 5 步你会在截图里看到 docsales 的行内仍有「删除」按钮。

第 4 步:配列级与字段级 ​

仍在同一个授权页,继续「新增授权」,区别只在资源树里选哪一类节点:

想达到的效果资源树里选动作效果字段显示模式
列表里「联系邮箱」整列消失列子资源 :col:contact_email查看拒绝—
表单里「法人证件号」整行消失字段子资源 :fld:id_card查看拒绝—
表单里「联系手机」置灰、改不动字段子资源 :fld:contact_mobile查看允许只读

字段模式的抽屉长这样(「字段显示模式」只在选中字段子资源时才出现):

编辑授权抽屉:字段子资源 + 查看 + 允许 + 字段显示模式「只读」

三种字段模式的口径:

字段模式列表新增/编辑表单提交时
可编辑(默认)正常显示正常输入正常写入
只读正常显示输入框置灰后端把该字段剥掉,传了也不写库
隐藏(= 字段资源被拒绝)不受影响该字段整行不渲染同上,不写库

「列」管列表,「字段」管表单,各管一段

拒绝 :col:contact_email 只让列表少一列;详情/编辑里仍能看到邮箱(掩码)。想让表单里也没有,得拒 :fld:contact_email。两个都拒才是「这个人彻底碰不到邮箱」。

第 5 步:登录验证「配了什么 → 看到什么」 ​

用 docadmin(租户管理员,无限制)和 docsales(受限)各登录一次,打开同一张表单页对照。

管理员基线:共 8 条,列从左到右含「联系邮箱」;行内编辑弹窗里「联系手机」可输入、「法人证件号(ID_CARD)」整行在。

管理员视角:共 8 条、含「联系邮箱」列,掩码是脱敏不是权限(租户管理员视角)

管理员编辑同一行:联系手机可编辑、法人证件号(ID_CARD)在列(租户管理员视角)

受限视角:共 2 条(只剩自己创建的);「联系手机」之后直接是「法人证件号」——联系邮箱整列没了;编辑弹窗里「联系手机」置灰、法人证件号整行消失。

受限视角:共 2 条、联系邮箱整列消失(行级权限用户视角)

受限视角编辑同一行:联系手机置灰只读、法人证件号整行不存在(行级权限用户视角)

对照表:

配置管理员看到docsales 看到
数据集 + 允许 + 仅自己的数据8 条2 条(creator = 自己)
:col:contact_email 拒绝联系邮箱列在整列消失
:fld:id_card 拒绝证件号行在表单里整行消失
:fld:contact_mobile 允许 + 只读手机可编辑输入框置灰,强行提交也被后端剥掉

行过滤是「静默」的:查不到不报权限错

docsales 用编号直查别人的行,返回的是「数据不存在」,不是「没有权限」——过滤条件直接拼进了 SQL,那一行对他而言等于不存在。列表上的查询条件会与行过滤叠加(AND),不会出现「我搜个关键词就绕过了过滤」的情况。排查问题时别被这句提示带偏方向。

第 6 步:用权限诊断复核 ​

配完不放心,用权限诊断问一句「docsales 对 infra:form-design-run:test_demo_verify_supplier:query 到底放不放行」:

  1. 打开 权限诊断,「用户」选 docsales;
  2. 「权限标识」填上面的标识(allow-create 下拉,填完回车落值),「动作」保持 查看;
  3. 点「诊断」。

结论区直接给「有权限」和命中的授权编号;下面「资源链」把目标资源到根的四层及各自默认效果摊开,「授权行」里高亮的两行就是参与最终决策的授权。

权限诊断:结论「有权限」+ 资源链(数据集默认允许)+ 命中授权高亮(租户管理员视角)

诊断只回答「动作层」,不回答行/列/字段

它告诉你「能不能进、能不能点」,不告诉你「能看几行、哪列消失」。行级与字段级的效果,用第 5 步的登录对照或角色资源授权的智能查看核对。反过来,「为什么他连这个菜单都没有」这类问题,诊断页是最快的答案(拒绝态的例子见权限诊断篇的配图)。

视角对照 ​

视角在这张表单上看到什么
超管 admin / 租户管理员 docadmin全部 8 条、全部列;编辑不受限
行级权限用户 docsales2 条;少一列;表单少一个字段、一个字段只读
普通员工 salesman01无此菜单;直达路由落在 404 页;数据接口显式拒绝(这张表单是老形态资源族,:query 动作行默认效果 = 拒绝)

菜单本身也是授权出来的

docsales 侧边栏里能出现「在线示例 → 校验示例4」,是因为第 3 步那条授权命中后,平台沿菜单父链把入口补了出来——这张表单的按钮资源各自带着菜单关联,授其中一条就够。新发布的表单不是这个形状:它塌缩成一行数据集资源,菜单关联在另一个同名节点上,要单独授一条「查看/允许」菜单才出现,见从零搭建一个应用第 5 步。

进阶 ​

  • 角色资源授权:授权行的完整字段、批量授权、智能查看(按角色维度看整棵权限树);
  • 权限规则:八类内置模板与自定义规则的参数写法;
  • 权限资源:资源树、默认效果、槽位映射与「明细设计」反查;
  • 权限诊断:决策链与命中明细的完整读法;
  • 表单运行时:脱敏策略、列设置等与权限无关的呈现配置。

常见问题 ​

Q:规则挂上了,但他一行都看不到? A:九成是槽位问题:数据集没配 owner 槽位,或这批行的 creator 不是他(历史数据是别人/系统建的)。回第 1 步看槽位映射,再看行的创建人。

Q:我拒了「联系邮箱」,列表里列还在? A:你拒的大概率是字段子资源(:fld:),它只管表单。列表整列消失要拒列子资源(:col:)。两者权限标识后缀不同,在资源树里是两类节点。

Q:表单里字段置灰了,但接口直接传值是不是还能改? A:不能。只读字段在写路径上会被后端剥掉——实测用接口强行提交改过的手机号,库里原值不动。前端置灰只是体验,兜底在服务端。

Q:为什么他还能看到「删除」按钮? A:链继承 + 数据集默认效果「允许」:没配授权的操作子资源会回落到链上祖先的允许。要禁就给 ...:delete 加一条显式拒绝(见第 3 步的 warning)。注意这只禁按钮/接口,不影响他删除自己名下的行是否合规——那由行过滤与你的业务口径决定。

Q:授权改完多久生效? A:动作与菜单层面有约 30 秒缓存;行/列/字段效果下次请求即生效。最稳妥的验证方式是退出重登再对照第 5 步。

相关页面 ​