如何同时为两个 users/teams 分配 R/W 所有权

How to assign R/W ownership for two users/teams simultaneously

我正在设计 CRM 中的审批系统,需要一些有关安全设计的信息。我使用的实体拥有 User/Team 级 R/W 权限。整体实现有点复杂,但为了让这个问题简单化,请考虑系统中涉及的以下两方:

请求者:需要R/W访问他创建的请求。

审批人 团队:这些是预定义的团队,其用户将approve/reject 请求。需要 R/W 访问需要他们批准的请求。

问题: 我如何处理同时为请求者和批准者团队提供 R/W 访问权限?由于我们不能在 CRM 中拥有多个记录的所有者,所有者字段一次只能包含其中一个(请求者或审批者团队)。

我可以想到两个使用共享功能的解决方案,并想确认我的理解:

a. 将请求者设置为记录所有者并以编程方式与审批团队共享记录。这种方法的问题是,即使我与审批团队共享记录,我也无法在主窗体上显示共享详细信息(这是必需的)。

b. 将审批团队设置为记录所有者,并使用访问模板以编程方式与请求者共享记录。

是否有更好的解决方案来处理此要求,以防我遗漏任何 OOB 可能性?

您的选择 a 最有意义:作为创建者的请求者应该拥有请求。审批人只是对请求进行操作,因此应该与它共享。

关于显示分享详情,您可以在表格中放置一个子网格:https://www.microsoft.com/en-us/dynamics/crm-customer-center/create-a-team-template-and-add-to-an-entity-form.aspx

Add a team template to the entity form

Make sure you have the System Administrator security role or equivalent permissions in Microsoft Dynamics 365.

Check your security role

[read more in the linked page]

由于请求者是用户,批准者是团队,OOB 您只能选择 b(分配给团队,通过访问团队与用户共享)。

我想不出任何干净的解决方案涉及列举团队成员并对他们每个人采取行动,所以我不建议这样做。

好吧,我相信您可以通过一些编码来制定解决方案 A(我不确定您是否不介意编码,但我们在 Whosebug 上,所以我认为您应该考虑一下)。 首先,设计取决于一个简单的问题——这个请求应该与多个团队共享,还是只与一个团队共享?单个团队很简单 - 只需在请求上添加一个查找,它将指向一个团队。当这个团队被填满时(我假设这个团队的选择是自动完成的,但这并不重要,因为在任何情况下你都必须以某种方式选择团队),你 运行 一个简单的插件分享这个团队的记录。使用 SDK 分享非常简单,只需使用 GrantAccessRequest:

var grantAccessRequest = new GrantAccessRequest
{
    PrincipalAccess = new PrincipalAccess
    {
        AccessMask = AccessRights.ReadAccess | AccessRights.WriteAccess,
        Principal = teamEntityReference
    },
    Target = requestReference
};

因此,在请求的表单中,您将保留请求的所有者,并将查找指向正在处理此请求的团队。当然,您可以通过例如 un-sharing 当请求被接受或拒绝或请求的查找更改等时进一步拉皮条。这将使 POA table 更快乐,因为共享大量记录会导致该记录的快速增长 table,因此如果不再需要共享,请务必取消共享记录。

如果你想分享给多个团队,你仍然可以在你的请求和团队之间创建一个 N:N 关系,并简单地在请求和团队之间关联消息的插件中分享你的请求(这是一个标准在为用户引入 Access Teams 之前的选项,仍然是团队的唯一选项)。这种关系可以在请求表单上显示为子网格(它看起来像访问团队子网格)。

当然,为了防止用户自己共享请求记录(在这种情况下,您的 lookup/subgrid 中将没有团队),他们不应该拥有共享权限。该插件应该在管理上下文中进行共享。

更新: 至于评论中的 POA 注意事项:两种解决方案都会使您的 POA 增长,因为对于这两种解决方案,您都必须与团队或用户共享请求。如果您将使用访问团队,您仍然会有一个 POA 条目用于每个请求(因此每年 100K 个条目)。我相信这里最重要的是 Request 在其生命周期结束时会发生什么。如果它不需要对团队可见,那么在 accepted/rejected 之后你应该简单地有一个机制(插件或一些自定义应用程序 运行 以某种及时的方式)将取消共享所有请求不再需要共享,使您的 POA table 保持在合理的大小。

还有另一种方法可以处理您的方案,不需要那么多 sharing/unsharing 逻辑。您可以使用 Request 在 1:N 父母关系中创建一个 "Request Acceptation" 实体。因为它是父母关系,拥有请求的用户将看到所有 "Request Acceptation" 和 "Request Acceptation" 将由适当的团队拥有(因此只有这个团队可以访问)。当然我对业务逻辑一无所知,但我假设 "Request Acceptation" 只能包含与团队相关的信息,这些信息可以在插件或工作流中复制。

更新 2:正如我刚才看到的,您无法在稍后阶段取消共享记录。但我假设在某个时间点 Request 是 done/accepted/finished/rejected 或其他什么。如果此时团队和用户都应该有权访问此请求,那么创建某种单独的实体 "Archived Requests" 可能是一件好事,它不会被共享,只需为所有感兴趣的主体克隆查看此信息并删除原始请求。这个想法有很多变体,我希望你能理解并根据你的场景进行调整