# 行级数据权限控制

行级数据权限控制指的是对用户针对具体某个实体的某条数据进行权限控制,是一种更加精确和更细粒度的权限控制方式。

因此对行级数据权限的控制,配置方式上也会比一般权限控制更加复杂一点。

# 加载行级数据权限

从前面介绍权限来源的章节我们可以知道,当用户打开页面时,前端会自动调用 /$perms 接口获取当前用户拥有的权限集合。

但是行级数据权限比较特殊,因为它基于用户、实体、数据ID三个维度。

一个用户对于不同实体的不同数据都可能具有不同的权限,因此在页面加载之初就获取所有行级数据权限的话:一是数据量可能很多,会造成请求耗时过久页面卡顿;二是没有这个必要,很可能这个页面其实只有一条数据权限需要判定而我们却加载了所有行级权限。

所以我们对行级数据权限的加载思路是按需加载

对此我们增加了一个交互动作叫加载行级数据权限 Action.LoadDataPermissions

当某个页面需要对某一条行级数据进行权限控制的时候,我们需要在 AdaptivePage 页面 即页面根元素上在页面加载前事件上添加交互加载行级数据权限

注意!一定要是在页面加载前这个事件上添加交互,因为这个事件是同步执行的,可以确保加载完权限之后页面才开始渲染。

在动作详情里我们需要指定具体的实体名和数据ID(支持表达式),这样才能加载到具体的行级数据权限。

动作详情里最后还有一个行级权限别名,这个是自动生成的唯一ID,用于标识具体的行级数据权限,以防当前页面有多条行级数据权限加载时无法区分。

# 对页面元素进行行级权限控制

当确保行级数据权限已经加载后,我们可以针对页面元素进行行级权限控制。

在页面中选择目标页面元素后,打开权限控制开关,在自定义权限输入框中我们可以根据具体需求指定行级权限。

对于行级数据权限我们固定了一个字符串前缀:$row:,后面接上在加载行级数据权限时生成的行级权限别名,最后再接上点号分隔的具体权限项如:.read

下图是行级数据权限编码的一个示例:

# 对整个页面进行行级权限控制

在一些场景中,需要对整个页面进行行级权限控制,如果用户不具备权限,则不做页面渲染并跳转到指定路由(如403页面)。

这个场景的行级权限控制与页面元素的行级权限控制差不多,也需要在 AdaptivePage 页面 即页面根元素上启用权限控制并在自定义权限输入框中指定行级权限编码。

但为了控制整个页面的渲染,我们还需要额外多做一步:即在页面上的页面加载前事件上添加交互校验行级数据权限

在这个动作详情中可以指定失败跳转路由,如定制的无权限提示页面或者403页面。如不填则单纯显示空白页面。

注意这个动作也一定要选择页面加载前这个事件,如果加载行级数据权限也在当前页面执行,则还要确保加载行级数据权限这个动作在校验行级数据权限之前执行。

顶部