如何按角色获取页面权限

How to get page permission by role

将 Kentico 11.0.26 与 MVC 结合使用。 我需要找出特定角色在页面上的权限。 API 示例页面仅显示了如何由用户(而不是角色)执行此操作。

https://docs.kentico.com/api11/content-management/page-security#Pagesecurity-Checkingpermissionsforspecificpages(ACLs)

编辑:我正在尝试像这样使用它

foreach (CMS.DocumentEngine.NodePermissionsEnum permission in (CMS.DocumentEngine.NodePermissionsEnum[])Enum.GetValues(typeof(CMS.DocumentEngine.NodePermissionsEnum)))
{
    DataSet dataSet = AclItemInfoProvider.GetAllowedRoles(page.NodeACLID, permission, "OperatorName,Allowed,Denied");
    foreach (DataTable table in dataSet.Tables)
    {
        foreach (DataRow row in table.Rows)
        {
            string roleName = row[table.Columns[0]].ToString();
            string allowed = row[table.Columns[1]].ToString();
            string denied = row[table.Columns[2]].ToString();
            Console.WriteLine("Role: {0}: Permission: {1}, Allowed: {2}, Denied: {3}", roleName, permission, allowed, denied);
        }
    }
}

为什么 allowed 的值为 47,而不是 0 或 1?

我无法对此进行测试,但这可能是一个错误。 API 内部有一个移位,它正在转换 SP 返回的值。您可以尝试仔细检查并将其作为错误提交。但是,您可以尝试通过对象查询检索角色绑定的 ACLItemInfo:

var AclItems = AclItemInfoProvider.GetAclItems().WhereEquals(nameof(AclItemInfo.RoleID), 7)

我的理解是,因为DB里面只有一个字段是Allowed values,但是有好几个权限,比如'Read (0), Modify (1), Create (2), Delete (3)..',所以都是一个字段保存为int值(以2为底)和与精确许可相关的指数)。在这种情况下,当您下次检索值时,您将确定选择了哪些,因为只有一个组合给出了确切的数字。为了澄清这一点,下面的每个数字代表一个权限(读取是 0,这意味着 2⁰ = 1,修改是 2¹ = 2,创建是 2² = 4 ...):

1 2 4 8 16 32 64 
+ + + + -  +   -  = 47

这意味着对于您当前的文档,您已授予:读取、修改、创建、删除和 ExploreTree 权限。

拒绝也一样。

您可以使用这段代码检查允许哪些权限:

    /// <summary>
    /// Parses permission value and return true if appropriate bit is 1.
    /// </summary>
    protected bool IsPermissionTrue(int permissionValue, NodePermissionsEnum permission)
    {
        return ((permissionValue >> Convert.ToInt32(permission)) % 2) == 1;
    }