如何按角色获取页面权限
How to get page permission by role
将 Kentico 11.0.26 与 MVC 结合使用。
我需要找出特定角色在页面上的权限。 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);
}
}
}
为什么 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;
}
将 Kentico 11.0.26 与 MVC 结合使用。 我需要找出特定角色在页面上的权限。 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);
}
}
}
为什么 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;
}