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();
}
}
});

posted @ 2010-07-15 23:34  icedog  阅读(377)  评论(0编辑  收藏  举报