VisualStudio开发WebPart之赋予具体用户某网站的权限

在开发webpart的过程中,有时需要给网站的特定用户以特定权限。下面是一个赋予权限的方法。(使用方法参照注释)

/// <summary>
/// 赋予网站权限。
/// </summary>
/// <param name="webUrl">网站URL</param>
/// <param name="spWeb">网站</param>
/// <returns>Trueの場合、権限設定成功、Falseの場合、権限設定失敗</returns>
private bool SetAuthority(string webUrl, SPWeb spWeb)
{
    bool isSuccess = true;
    try
    {
        //获取画面上管理者(SharePoint:PeopleEditor控件,只能够输入域用户名称的控件)控件中的用户或者组。
        ArrayList lstReManage = PeditManagers.ResolvedEntities;
        //获取画面上阅览者(SharePoint:PeopleEditor控件,只能够输入域用户名称的控件)控件中的用户或者组。
        ArrayList lstReReader = PeditReaders.ResolvedEntities;
        //获取画面上编辑者(SharePoint:PeopleEditor控件,只能够输入域用户名称的控件)控件中的用户或者组。
        ArrayList lstReEditor = PeditEditors.ResolvedEntities;
       //SPSecurity.RunWithElevatedPrivileges(delegate(){})这句代码是用来提升权限的,如果操作者本人可能并不具备网站的操作权限,则必须加这块代码
        SPSecurity.RunWithElevatedPrivileges(delegate()
        {
            using (SPSite site = new SPSite(spWeb.Url + "/" + webUrl))
            {
                using (SPWeb EstimationSite = site.OpenWeb())
                {
                   spweb.BreakRoleInheritance(false); //断开此网站从别的网站继承的权限
                    for (int i = 0; i < EstimationSite.RoleAssignments.Count; i++) //遍历网站的角色分配集合(可以理解为用户和权限的分配组合)
                    {
                        EstimationSite.RoleAssignments.Remove(i); //移除原有用户和权限的分配组合
                        i--;
                    }
                    SPRoleAssignmentCollection roles = site.RootWeb.RoleAssignments; //获取根网站的用户和权限组合
                    string users = ReadXmlData("アクセス権削除");  //此处为读取一个外部xml文件中的内容,内容为需要删除权限的用户或者组
                    string userList = users.Split(';');
                    foreach (SPRoleAssignment role in roles) //遍历根网站上的用户权限分配组合
                    {
                        bool deleteflg = false;
                        foreach (string item in userList) //遍历从外部xml中获取的用户或者组
                        {
                            //如果当前网站中包含xml中的用户或者组,则准备删除对应用户或者组的权限
                            if (role.Member.Name == item)
                            {
                                deleteflg = true;
                            }
                        }
                       //如果当前用户没有在xml中出现则,把根网站中对应用户的权限赋给当前网站(EstimationSite)
                        if (!deleteflg) 
                        {
                            EstimationSite.RoleAssignments.Add(role);
                        }
                    }
                   //通过SPContext类来获取当前网站对应的根网站
                    SPWeb rootweb = SPContext.Current.Site.RootWeb;
                   //实例化一个当前用户的权限分配组合
                    SPRoleAssignment roleAss = new SPRoleAssignment((SPPrincipal)SPContext.Current.Web.CurrentUser);
                   //设定上述权限分配组合的具体权限(フル コントロール就是完全控制)
                    roleAss.RoleDefinitionBindings.Add(EstimationSite.RoleDefinitions["フル コントロール"]);
                   //给网站分配上面设定好的用户权限分配组合
                    EstimationSite.RoleAssignments.Add(roleAss);
                   //初始化一个用户权限分配组合
                    SPRoleAssignment spRoleAss = null;
                    //需要设定为管理这权限的用户的取得
                    foreach (PickerEntity item in lstReManage)
                    {
                        //用户的情况下(对应真实环境的域名为AD,所以这里通过ProviderName为AD判断是用户而非组)
                        if (item.ProviderName == "AD")
                        {
                           //分配用户给用户权限组合
                            spRoleAss = new SPRoleAssignment(EstimationSite.EnsureUser(item.Key));
                        }
                        else
                        {
                       //组的情况下
                           //分配组给用户权限组合
                            spRoleAss = new SPRoleAssignment(EstimationSite.SiteGroups[item.Key]);
                        }
                        if (spRoleAss != null)
                        {
                           //获取xml文件中[カスタム権限]的内容,xml中此节点中保存的是权限名称(比如完全控制,阅览,编辑等等)
                            string roleDefinition = ReadXmlData("カスタム権限");
                           //获取网站权限的定义(比如完全控制,阅览,编辑等等)
                            SPRoleDefinitionCollection roleDefinitions = EstimationSite.RoleDefinitions;
                            foreach (SPRoleDefinition role in roleDefinitions)
                            {
                                if (role.Name == roleDefinition)
                                {
                                   //给用户或者组分配对应的权限
                                    spRoleAss.RoleDefinitionBindings.Add(rootweb.RoleDefinitions[roleDefinition]);
                                   //给网站设置上述用户权限组合
                                    EstimationSite.RoleAssignments.Add(spRoleAss);
                                }
                            }
                        }
                    }
                   //以下权限分配方式和上面类似
                    //閲覧者取得
                    foreach (PickerEntity item in lstReReader)
                    {
                        //ユーザの場合、
                        if (item.ProviderName == "AD")
                        {
                            spRoleAss = new SPRoleAssignment(EstimationSite.EnsureUser(item.Key));
                            //入力した閲覧者がSharePointグループ場合。
                        }
                        else
                        {
                            spRoleAss = new SPRoleAssignment(EstimationSite.SiteGroups[item.Key]);
                        }
                        if (spRoleAss != null)
                        {
                            spRoleAss.RoleDefinitionBindings.Add(rootweb.RoleDefinitions["閲覧"]);
                            EstimationSite.RoleAssignments.Add(spRoleAss);
                        }
                    }
                    //編集者取得
                    foreach (PickerEntity item in lstReEditor)
                    {
                        //ユーザの場合、
                        if (item.ProviderName == "AD")
                        {
                            spRoleAss = new SPRoleAssignment(EstimationSite.EnsureUser(item.Key));
                            //入力した閲覧者がSharePointグループ場合。
                        }
                        else
                        {
                            spRoleAss = new SPRoleAssignment(EstimationSite.SiteGroups[item.Key]);
                        }
                        if (spRoleAss != null)
                        {
                            spRoleAss.RoleDefinitionBindings.Add(rootweb.RoleDefinitions["投稿"]);
                            EstimationSite.RoleAssignments.Add(spRoleAss);
                        }
                    }
                    EstimationSite.Update();
                }
            }
        });
    }
    catch (Microsoft.SharePoint.SPException ex)
    {
        //Webプロパティ追加操作中異常発生する場合、logでError出力
        log4net.ILog log = log4net.LogManager.GetLogger(this.GetType());
        log4net.MDC.Set("messageID", "COE00010");
        log.Error(string.Format(GetMessageInfo("COE00010"), webUrl), ex);
        isSuccess = false;
    }
    return isSuccess;
}