Dataverse行级安全:深入解析基于业务单元的权限控制

本文详细介绍了如何在Dataverse中实现行级安全,包括启用业务单元功能、创建业务单元、配置安全角色、分配用户权限以及设置记录业务单元的具体步骤和注意事项。

Dataverse行级安全

行级安全是高级数据库的基本访问需求之一。Dataverse使用基于角色的访问控制(RBAC),没有访问层次结构,而是基于创建的角色为每个表设置访问权限。这样可以通过配置实现所有角色所需的最小权限。

安全角色默认提供表级访问,角色允许以下特定级别:

  • 创建
  • 读取
  • 更新
  • 删除
  • 共享
  • 追加
  • 追加到

它还提供了启用字段级安全的附加选项,因此角色可以为每个字段设置特定级别(例如,可以编辑除一个字段外的所有字段,该字段只能查看,非常适合审批)。但如果您想根据特定行的值控制访问权限呢?一个好的例子是商店销售,区域经理只能查看其区域内商店的销售数据。这就是行级安全,通常是最难使用的,因为它使用动态数据进行访问,而不是像表和字段这样的模式数据。

Dataverse使用业务单元启用行级安全,其附加好处是它们是基于节点的,因此有父级可以继承其子级的访问权限。但正如我所说,它不像表和字段级那样容易设置,所以我想写一篇博客来介绍它😎

启用功能

创建业务单元

为业务单元创建安全角色

将角色分配给用户/团队

设置记录业务单元

1. 启用功能

业务单元需要在每个环境中启用,因为这需要更新所有Dataverse表,向模式添加业务单元字段。因此,启用时可能需要几分钟时间才能正确通过环境,并且还会强制所有您希望部署到的下游环境也启用此功能。

要启用,请转到PPAC(Power Platform管理中心),选择环境,转到设置/产品功能,然后打开“跨业务单元的记录所有权”。

就这样。

2. 创建业务单元

业务单元在每个环境中创建(遗憾的是,它们不支持解决方案感知,因此无法部署)。就像功能标志一样,您转到PPAC,选择环境,设置/用户+权限 - 业务单元。

您应该看到所有当前的业务单元,并在顶部有创建新业务单元的选项。业务单元可以嵌套/分层,因此您可以将任何其他业务单元设置为父级(否则它将默认为整个环境单元)。

您可以在这里或Dynamics 365应用程序中更新/管理它们。Dynamics应用程序的附加好处是能够导出/导入您的业务单元(这样您可以复制到其他环境)。

请注意,业务单元像大多数东西一样只是Dataverse表(businessunits),因此使用流/自定义脚本,您可以利用API直接在环境之间复制业务单元。

3. 为业务单元创建安全角色

安全角色将用于使用业务单元的表,我在这里写了一篇关于安全角色的完整博客以获取更多信息。但在这个例子中,我创建了一个简单的销售表,包含商店、区域、销售。我想让用户访问其业务单元区域内的商店。

角色需要具有对自定义表的所有所需访问权限,但设置为业务单元。此外,您需要具有读取和追加到业务单元表的权限。

请注意,您还可以创建范围限定到业务单元的安全角色,因此您可以拥有使用团队/用户设置业务单元的角色,或者设置业务单元的角色。

4. 将角色分配给用户

尽管业务单元显示为团队,但无法向其中添加用户,因此我们需要创建新团队。

创建团队时,我们可以设置要使用的业务单元,这意味着团队的所有成员都将具有对该业务单元的访问权限。

我们最后将自定义安全角色分配给团队。

5. 设置记录业务单元

现在我们有了访问设置,但如何将区域链接到业务单元?简单的方法是我们有一对一的映射,因此我们不再有区域,只有业务单元,当添加数据时,我们通过设置业务单元来设置区域。

另一种方法是使用自动化低代码插件,我之前在这里更详细地介绍过它们。 因此,在这种情况下,创建行将触发一个插件来设置业务单元。为了更容易,我创建了一个查找表,在这种情况下是区域,它在区域和业务单元之间创建关系。我们需要确保我们的销售表使用区域表作为查找,并确保我们的安全角色具有读取和追加此表的权限。

这可能看起来不必要,而且可能确实如此,但它确实允许您将业务单元与区域分开,这意味着您可以添加更复杂的逻辑或在不同区域等重用业务单元。 低代码插件/Dataverse函数状态您应该使用Set()来更新记录,以防止无限循环。但由于这仍然非常错误,它不起作用,您会收到以下错误:“此记录无法复制。相反,使用{…}表示法创建内联记录以复制所需的各个字段。” 这个错误在18个月前被记录,但仍然没有修复,所以我对它很快修复不抱太大希望。这意味着我们只能在创建时运行此操作,而不能修改。要修改,我们必须触发一个流。 低代码插件应该看起来像这样:

1
2
3
4
5
6
With({
    bu:NewRecord.Region.'Owning Business Unit',
    buRecord:NewRecord
},
Patch(Sales,buRecord,{'Owning Business Unit':bu})
)

就这样,我们现在有了行级安全,明白我的意思了吗,它不像字段或表级那样简单。

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计