Ebaas

设置数据操作权限

May 10, 2020 | 1 Minute Read

企业应用软件往往需要设置对数据操作的权限。根据用户在系统中的角色或所属部门的不同,设置用户对不同数据类的操作权限,例如,是否允许读取,创建,修改或删除数据实例。

相关术语

在Ebaas中,数据操作权限由权限控制规则来决定。一个权限控制规则包含四个要素:

  • 对象 :规则所针对的对象,例如,数据模型,数据类和属性等;
  • 作用者 :规则的作用者,例如,角色,角色组合或用户;
  • 操作:规则控制的操作,例如,读取,修改,创建,上传和删除;
  • 权限:规则对所控制操作的权限,即,“允许”或“拒绝”;

权限控制规则是数据模型的一部分,并与数据模型一同保存在数据库中。在系统运行时,服务器端的权限控制引擎会根据权限控制规则来验证每个对数据操作的请求,并确定是允许还是拒绝。不同用户登录Web界面后,Web界面也会根据权限控制规则来决定是否显示相应的数据操作功能。

权限控制例子

当您在数据模型中创建一个数据类时,默认权限控制规则是允许任何人对这个数据类进行增删改查。假设,业务需求要求您对“事务”数据类设置一下的权限控制规则:

  • 规则1:默认情况下,任何人对“事务”数据类只能查看,不能添,改或删;
  • 规则2:具有管理员角色的用户可以对“事务”数据类进行增,删,改,查;
  • 规则3:当“事务”的数据实例的“状态”值不等于为“关闭”时,允许“产品试验室”部门的用户进行增,改,查;

以下是描述如何实施这些要求的步骤。

设置权限冲突解决策略

每条权限控制规则都需要定义“作用者”。作用者通常是某个角色或部门。如果某个用户具有多个角色或属于多个部门,就可能有多条权限规则对其起作用,因而会产生权限冲突的情况。假设,用户demo1即属于“管理员”角色,又属于“操作员”角色。一条权限规则允许“管理员”角色的用户修改“事务”数据类的记录,而另一条权限规则拒绝“操作员”角色的用户修改“事务”数据类的数据记录。那么,系统到底是允许还是拒绝用户demo1对“事务”数据类的数据记录进行修改呢?

遇到这种情况,系统将根据“权限冲突解决方案”的设置来决定。

下面我们使用DesignStudio工具来配置以上权限规则。冲突解决方案有三种:

  • 拒绝优先: 当存在冲突时,选择“拒绝”权限;
  • 允许优先: 当存在冲突时,选择“允许”权限;
  • 以默认值为准:当存在冲突时,以默认值的设置为准;

权限冲突解决方案的设置要根据整体权限控制要求来设置,使得创建的权限规则数量尽量的少,容易维护。在我们教程的例子中,根据上面的权限控制要求,我们要选择“允许优先”的策略。具体步骤如下:

  • 从“开始”菜单 => Ebaas => DesignStudio => 打开DesignStudio;
  • 选择“事务跟踪管理”数据库并以admin身份登陆;
  • 在工具栏上选择“工具” => “选项” => “权限控制”,如下图;

  • 在打开的“权限控制选项对话框”选中“允许优先”选项,如下图。

配置权限规则1

  • 在左边模型树中选择“事务”数据类。然后单击右侧的“访问控制”选项卡,可以看见有一条作用者为“Everyone”的继承的权限规则。如下图;

提示: ‘Everyone’角色是系统内置角色,所有的用户都属于这个角色。当创建‘事务跟踪管理’数据模型时,系统自动在数据模型上创建了了‘Everyone’角色的权限规则,并赋予所有操作‘允许’权限。在数据模型层创建的权限规则会被模型中的所有数据类继承。在数据模型层面定义权限规则就像定义全局规则一样,可以避免在每个数据类定义相似的权限规则,从而简化设置权限控制的工作


由于继承的权限规则允许所有人对“事务”数据类进行增删改查,因而,不符合规则1的要求,即在默认情况下,任何人只能对“事务”进行查看。但是我们不能修改继承的规则的权限设置。

为了实现规则1的要求,我们需要创建一条本地规则来覆盖继承的规则,设置符合要求的操作权限。具体步骤如下:

  • 单击“添加”按钮 => 在打开“定义用户和角色”框 => 选中“角色”类型 => 选择名称为“Everyone”的角色 => 单击“确认”,如下图;

由于作用者为“Everyone”的规则已经存在,界面会弹出下图的确认框,点击“确认”键进行覆盖。

注意,这时作用者为“Everyone”的规则的隶属关系变为“本地”,表示覆盖成功。

  • 将这条本地规则的读取和下载权限设置为“允许”,其余权限设置为“拒绝”,如下图;

这样我们为“事务”数据类创建了一个对所有用户只允许读取和下载的默认规则。

配置权限规则2

规则2用于允许具有管理员角色的用户对“事务”数据类有增删改查的权限。所以需要创建一个针对“管理员”角色的规则,并为其授予所有权限。创建规则2的步骤与上述方法一样,如下图。

然后将作用者为“Administrator”的规则的读取、下载、修改、上传、创建和删除权限设置为“允许”,如下图。

配置权限规则3

规则3的要求较为复杂。需要创建记录级的权限控制规则来实现。所谓记录级的权限控制规则就是当数据记录(也称为数据实例)满足某个条件时,则规则生效。由于规则3要求当事务实例的状态不等于“关闭”时,才能对其进行修改。因而这里需要采用记录级的权限控制规则。下面,我们来介绍创建这个规则的步骤。

  • 添加一条作用者为“产品实验室”部门的规则,将其增,改和查的权限设置为”允许“,删除为“拒绝”;
  • 将下面的条件表达式复制粘贴到“过滤条件”下的文本框中,表示这条规则在数据实例的“状态”值不是“关闭”时生效,在等于“关闭”时无效;
$this/Status!="关闭"

规则3的配置结果如下图。

提示: 过滤条件是XQuery语句,用于评价数据实例是否符合该表达式的结果。如果结果为True,则应用该权限规则。否则,就不使用该权限规则。


保存数据模型

我们创建了三条权限控制规则实现了权限控制的要求。单击工具栏上的“保存到数据库”图标将数据模型保存到数据库。如下图。

测试权限控制

使用推荐的Web浏览器连接到Web客户端(http://localhost:8080)。

测试规则1

我们首先检查规则1,即一般用户只允许查看事务,而不能对其增删改。

登录为demo8。“demo8”用户的密码是“888”。demo8用户不属于“产品实验室”也不是系统管理员。因而只能查看“事务”。登录后进入“事务管理”界面,展开任何一条记录的命令栏,应没有允许其修改和删除事务的命令。如下图。

打开添加表单,也没有提交按键。证明了规则1满足要求。

提示: 对于demo8用户,只有'Everyone'为作用者的规则起作用。该规则不允许增删改。


测试规则2

测试权限规则2。即具有管理员角色的用户具有增删改查的权限。

注销“demo8”,以具有管理员角色的“demo1”登录。 “demo1”用户的密码是“888”。进入“事务管理”界面 展开任何一条“事务”数据记录的命令栏,可以看到编辑和删除命令。

打开添加表单也显示“提交”按键。验证了权限规则2起作用。

提示: 对于demo1用户,有'Everyone'为作用者和‘Administror’的两条规则起作用,其中‘Administrator’规则允许增删改。


测试规则3

最后,测试规则3。即属于“产品实验室”的用户可以对“状态”不等于“关闭”的事物进行修改,但对状态为“关闭”的事务则不能修改。

注销“demo1”,以“demo2”登录,“demo2”的密码是“888”。demo2属于“产品实验室”部门。

打开“事务管理”页面,展开“状态”为“关闭”的数据实例。在展开的命令栏中没有没有“编辑”和“删除”命令,如下图。

提示: 对于demo2用户和‘状态’等于‘关闭’的数据实例,只有'Everyone'为作用者的规则起作用,这条规则不允许增删改。作用者为‘LabA’的权限规则由于不满足规则的过滤条件而无效。


展开点击“状态”不是“关闭”的数据实例,在命令栏中有“编辑”命令,如下图。

提示: 对于demo2用户和‘状态’不等于‘关闭’的数据实例,有'Everyone'为作用者和‘LabA’为作用者的两条规则起作用。其中,‘LabA’规则允许增改


本教程介绍了一些基本的数据操作权限控制配置方法。请参看后续的高级教程了解更多的数据操作权限配置功能。