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

  • 相关阅读:
    C++中如何使用大整数__int 128
    全排列问题
    读书札记:瑞士法郎的因素
    读书札记:影响欧元的因素
    金融市场:最全的外汇平台资料大全(包括开户金额、点差、特色!)
    读书札记:澳大利亚元因素
    情感日记:祭衣文
    情感日记:第一次亲密的接触
    读书札记:美元影响的因素
    读书札记:外汇市场
  • 原文地址:https://www.cnblogs.com/icedog/p/1778491.html
Copyright © 2020-2023  润新知