在MVC中使用Kentico 11.0.26。 我需要找出页面上特定角色的权限。 “ API示例”页面仅显示如何按用户(而非角色)进行操作。
编辑:我正在尝试像这样使用它
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);
}
}
}
为什么允许的值为47,而不是0或1?
答案 0 :(得分:0)
我无法对此进行测试,但这可能是一个错误。 API内有一个位移,它正在转换SP返回的值。您可以尝试再次检查并将其作为错误提交。但是,您可以尝试通过对象查询检索角色绑定的ACLItemInfo:
var AclItems = AclItemInfoProvider.GetAclItems().WhereEquals(nameof(AclItemInfo.RoleID), 7)
答案 1 :(得分:0)
我的理解是,因为数据库中只有一个字段包含允许的值,但是有多个权限,例如“读取(0),修改(1),创建(2),删除(3)..”。 ,它们全部都保存为int值(以2为底,且与精确权限有关的指数)保存在一个字段中。在这种情况下,下次检索值时,您将确定知道选择了哪个值,因为只有一个组合给出了准确的数字。为了澄清这一点,下面的每个数字代表一个许可(Read为0,表示2⁰= 1,Modify为2¹= 2,Create为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;
}