Removing User Permissions From a List Item
Programmatically modifying the item-level permissions in a list involves manipulation of the Role Assignments collection for that item.
This example shows how to remove a specific role definition from each of the members of a user collection:
/// <summary>
/// Remove a role definition from each of the members of a user collection for a list item
/// </summary>
/// <param name="item">The List Item</param>
/// <param name="userVals">The collection of users who are to have the role definition removed</param>
/// <param name="def">The role definition to remove</param>
internal static void RemoveRoleDefinitionFromUsers(SPListItem item, SPFieldUserValueCollection userVals, SPRoleDefinition def)
{
if (userVals != null)
{
foreach (SPFieldUserValue userVal in userVals)
{
SPUser user = userVal.User;
SPRoleAssignment role = item.RoleAssignments.GetAssignmentByPrincipal((SPPrincipal)user);
if (role != null)
{
if (role.RoleDefinitionBindings.Contains(def))
{
role.RoleDefinitionBindings.Remove(def);
role.Update();
item.SystemUpdate(false);
}
}
}
}
}
===========================================================
SPRoleDefinition用于角色(即前面所说的“权限级别”)的定义
它的几个重要的属性有:
Name:角色名称
Description:角色描述
BasePermissions:角色的权限(就是在这个地方指定详细的权限)
另外,Type属性是SPRoleType枚举类型的,这个和2003一样,枚举的条目好像也一样,说明在默认的情况下,角色还是那么几种
另外,关于权限的枚举在2003里面是SPRights,但是这个东西在2007里面同样被宣布成Obsolete的了,取而代之的是SPBasePermissions(其实内容差不太多)
SPRoleAssignment用于权限的分配,它比较简单,只有三个public的属性:
Member:把权限分配给谁
Parent:在什么东西上分配权限
RoleDefinitionBindings:分配什么权限
从最后一个东西的名字上来看,在2007里,权限的分配其实已经变成了角色的绑定
依次看一下上面这三个东西
Member是SPPrincipal类型的(它其实相当于2003里的SPMember),是SPUser和SPGroup的父类
Parent:一个实现了ISecurityxxxx接口的东东(估计2007里能分配权限的类都实现了这个接口)
RoleDefinitionBindings:可以理解为SPRoleDefinition的一个集合(虽然在对象模型上有点区别)
在2007里面
每一个能分配权限的东西(SPWeb、SPList、SPListItem等)都会有一个RoleAssignments属性,它是一个SPRoleAssignmentCollection类型的属性,用于分配权限
此外,在SPWeb里还有RoleDefinitions属性(只在SPWeb里有,也就是说角色只能定义在网站里)
举个例子,
比如我们要给一个用户(user)分配一个在列表(list)上的权限,权限使用了一个名叫“xxx”的角色
代码如下:
SPRoleAssignment ra = new SPRoleAssignment(user);
SPRoleDefinition rd = web.RoleDefinitions["xxx"];
ra.RoldDefinitionBindings.Add(rd);
list.RoleAssignments.Add(ra);
又比如,修改一个用户的权限:
SPRoleAssignment ra = list.RoleAssignments.GetAssignmentByPrincipal(user);
SPRoleDefinition rd = web.RoleDefinitions["xxx"];
ra.RoldDefinitionBindings.Add(rd);
ra.Update();
但是,如果这个列表的权限之前是继承自网站的,
那么上面的代码并不会自动的修改这种继承,反而会抛出异常
我们必须手工解除这种继承关系:
list.BreakRoleInheritance(true);
参数中true的意思是把继承下来的权限重新copy过来(如果你不改它的话,它和网站的权限还是一样的),如果是false,则使用列表模版中定义的默认权限
在使用“BreakRoleInheritance(bool)和ResetRoleInheritance()”时应确保CurrWeb的“AllowUnsafeUpdates==true”,BreakRoleInheritance之后应再次用“AllowUnsafeUpdates=true”使AllowUnsafeUpdates为true,以便以后向‘权限集’内增加权限之用。
example:
Guid siteId=SPControl.GetContextSite(HttpContext.Current).ID;
SPSecurity.RunWithElevatedPrivileges(delegate()
{
using(SPSite site=new SPSite(siteId))
{
using(SPWeb web=site.openweb())
{
SPRoleAssignment assignment = web.RoleAssignments.GetAssignmentByPrincipal((SPPrincipal)web.CurrentUser);
StringBuilder sb = new StringBuilder("");
foreach (SPRoleDefinition role in assignment.RoleDefinitionBindings)
{
sb.AppendLine(role.Name);
sb.AppendLine(role.BasePermissions.ToString());
sb.AppendLine("#");
}
lblErrorMessage.Text = sb.ToString();
}
}
});