目录
article
VisualStudio开发WebPart之赋予具体用户某网站的权限
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;
}