基于Sharepoint做一個客戶管理的系統,由于客戶方對權限的要求非常嚴格,所以不得不自己去定義網站的權限,好在Sharepoint提供的權限系統比較完善,我們所創建的權限包括從創建SPWeb到創建SPListItem均實現了一遍,也算是順利的解決了問題。項目做到第一階段,談談自己的一些認識。
在開始之前先明確幾個類或者定義:
Sharepoint權限系統采用 權限——角色 ——對象——關聯 的概念,即:對于一個對象(如:SPWeb,SPList,SPListItem),可以通過添加某個已經包含了角色(SPRoleDefinition)的關聯(SPRoleAssignment)而更改該對象的權限,而角色(SPRoleDefinition)則是提前通過SPWeb.RoleDefinitions添加到網站內的,注意:只有SPWeb有此屬性可以添加角色定義,其他對象如SPSite,SPList,SPListItem均不能添加角色定義,當然他們也不需要。
相關類:
用戶或用戶組:SPPrincipal 擴展了兩個子類:SPUser和SPGroup
權限基類:SPBasePermissions,通過或計算合成一個自定義的權限,注意:需要編輯權限的前提是有查看權限;
角色類:SPRoleDefinition,采用web.RoleDefinitions.Add(definition)的方式添加角色;
關聯類:對于某個SPPrincipal添加一個SPRoleDefinition的角色,然后再將該關聯添加到對象上去,注意:在未將該關聯添加到對象上時,該關聯都無效。
首先定義自己的權限系統,我定義了四個級別的角色,本別具有權限:查看、新建、編輯、刪除,這四個權限要遠低于Sharepoint本身的權限,這里以新建角色為例說明: 同時定義了負責向網站添加角色Register類,每一個角色都會對應一個Register類,是為了方便權限的擴展,采用依賴倒置。
為對象分配權限:參數SPListItem 也可以是 SPWeb,SPList,權限的分配一般是在對象剛剛創建后來實現,如
SPWebTemplate template = web.Site.GetCustomWebTemplates((uint)web.Locale.LCID)[WebTemplate];
SPWeb newWeb = RootSPWeb.Webs.Add(rurl, customerName, string.Empty, (uint)2052, template, true, false);
此時就應該對該newWeb做權限操作。而SPListItem的操作一般是在SPItemEventReceiver的ItemAdded事件中去實現

Code
private void RoleAssignment(SPListItem item, SPPrincipal groupOrUser, SPRoleDefinition role)
{
if (!item.HasUniqueRoleAssignments)
{
item.BreakRoleInheritance(true);//true則斷開并繼承原有權限,false則斷開不繼承原有權限
}
this.DisableEventFiring();
item.Web.AllowUnsafeUpdates = true;
SPRoleAssignment assignment = new SPRoleAssignment(groupOrUser);
assignment.RoleDefinitionBindings.Add(role);
item.RoleAssignments.Add(assignment);
item.Update();
this.EnableEventFiring();
}

Code
//角色基類:實際上基類提供了查看的權限,因此在查看中不需要擴展
public abstract class BasePermissionRole
{
private string roleName;
public virtual string RoleName
{
get
{
return roleName;
}
set
{
roleName = value;
}
}
private string roleDescription;
public virtual string RoleDescription
{
get
{
return roleDescription;
}
set
{
roleDescription = value;
}
}
public abstract SPBasePermissions ComposePermission();
protected virtual SPBasePermissions ComposeViewPermission()
{
//對應Sharepoint下的34個基本權限
return SPBasePermissions.ViewListItems | SPBasePermissions.ViewVersions |
SPBasePermissions.ViewFormPages | SPBasePermissions.ViewPages |
SPBasePermissions.OpenItems | SPBasePermissions.CreateAlerts |
SPBasePermissions.BrowseUserInfo | SPBasePermissions.UseRemoteAPIs |
SPBasePermissions.UseClientIntegration | SPBasePermissions.Open;
}
public abstract BaseRoleRegister CreateRegister();//通過依賴倒置以及單件實現角色注冊
}
//新建角色,override基類的ComposePermission()方法,并在View的基礎上擴展
public class AddPermissionRole : BasePermissionRole
{
public AddPermissionRole()
{
this.RoleName = "新建";
this.RoleDescription = "向列表中添加項目,向文檔庫中添加文檔,以及添加 Web 討論評論";
}
public override string RoleName
{
get
{
return base.RoleName;
}
set
{
base.RoleName = value;
}
}
public override SPBasePermissions ComposePermission()
{
return base.ComposeViewPermission() | SPBasePermissions.AddListItems;
}
public override BaseRoleRegister CreateRegister()
{
return new AddRoleRegister(this);
}
}
//注冊基類:
public class BaseRoleRegister
{
public BaseRoleRegister(BasePermissionRole role)
{
this.Permission = role;
}
protected BasePermissionRole Permission;
public virtual SPRoleDefinition ExecuteRegister(SPWeb web)
{
foreach (SPRoleDefinition rd in web.RoleDefinitions)
{
if (rd.Name == this.Permission.RoleName)
return rd;
}
SPRoleDefinition definition = new SPRoleDefinition();
definition.Name = this.Permission.RoleName;
definition.BasePermissions = this.Permission.ComposePermission();
definition.Description = this.Permission.RoleDescription;
web.RoleDefinitions.BreakInheritance(true, true);
web.RoleDefinitions.Add(definition);
web.Update();
return web.RoleDefinitions[this.Permission.RoleName];
}
}
//新建角色的注冊類:
public class ApproveRoleRegister : BaseRoleRegister
{
public ApproveRoleRegister(BasePermissionRole role)
: base(role)
{ }
}