使用代码设置Item级的权限(权限总结1)
itle in english:set Item Level Permission for SharePoint? (MOSS/WSS) List/Document Library Programmatically
有些時候,我們需要為文檔庫里面某個文件設置特殊的權限,這個權限不繼承自列表權限,當然最簡單的最好是再創建一個列表,然后存儲相關文件,這樣做目的是達到了,但是卻會帶來很多冗余。雖說sharepoint的用戶權限系統強大,但是他最小的粒度也只到了列表級別,所以我們這里研究小于列表級別的權限就顯得非常有必要了。
? 在sharepoint中,系統自帶的權限可以用下圖描述出來,藍線表示我們的listitem實際是繼承了list的權限系統,那么他的所有讀寫權限都是一樣的
? 藍線表示我們的listitem實際是繼承了list的權限系統,那么他的所有讀寫權限都是一樣的。這樣會帶來一個問題,那就是如果我們現在因為業務邏輯的需要,必須對list內的某一個具體項目設置特定的權限,這種自帶的權限系統就無法滿足了。其實這樣的需求還是蠻廣泛的,并不是因為我或者某人憑空想象出來的,這里我們討論的權限可以用我們的紅線來表示,為每個listitem設置獨立的權限系統。
要實現listitem獨立的權限系統,首先必須先打破繼承,好在微軟提供的相關的接口讓我們完成這個工作
使用代碼SPListItem.BreakRoleInheritance(true);之后我們的權限邏輯圖可以用下圖來描述。
? 好了,束縛也已經被打破了,下面我們來找一個切入點來實現我們的功能,在適當的時候加載我們的權限代碼才能達到正確的效果,為了找到這個正確的時候,我們必須先了解一下listitem的創建過程,下圖很直觀的描述了listitem在添加時所觸發的事件。
? 這里我們用ItemUpdated 事件來完成我們的功能,為這個事件綁定一個處理邏輯,為了簡單起便,我這里只給出了邏輯部分。在ItemUpdated事件發生時,調用一下代碼便可以實現listitem級別的權限系統.
使用代碼為sharepoint/MOSS設置Item級的權限,代碼如下: publicstringItemPermission(stringSitePath)????{
????????stringReturnVal?="";
????????try
????????{
????????????SPSite?WebApp?=newSPSite(SitePath);
????????????SPWeb?Site?=WebApp.OpenWeb();
????????????SPList?list?=Site.Lists["TestDocLib"];
????????????SPListItem?item?=list.Items[0];
????????????SPRoleDefinition?RoleDefinition?=Site.RoleDefinitions.GetByType(SPRoleType.Contributor);
????????????SPRoleAssignment?RoleAssignment?=newSPRoleAssignment("<domain>\\<user>",?"email",?"name",?"notes");
????????????RoleAssignment.RoleDefinitionBindings.Add(RoleDefinition);
????????????if(!item.HasUniqueRoleAssignments)
????????????{
????????????????item.BreakRoleInheritance(true);????????????????
????????????}
????????????item.RoleAssignments.Add(RoleAssignment);
????????????item.Update();
????????}
????????catch(Exception?ex)
????????{
????????????ReturnVal?+="Permission?not?set,?reason:?"+ex.Message;
????????}
????????returnReturnVal;
????}
? item.BreakRoleInheritance(true);這句代碼是精髓。
好了,我們的需求很快的并且很好的得到了滿足,不過先不要那么高興,還有一個很重要的問題我們沒有解決,那就是怎么轉移權限。
我們設置了item級別的權限,大家可以設想一下,要是在這個權限系統中,唯一的一個擁有修改權限的人離職了,其他人全部都是只讀權限,天啦,我們公司因為一個人的離開損失多大啊。作為開發人員,我們必須在系統設立之初就解決掉這樣的災難性的問題。下面我提供了一個解決方案,來批量的轉移我們的權限
usingSystem;usingSystem.Web;
usingSystem.Web.Services;
usingSystem.Web.Services.Protocols;
usingMicrosoft.SharePoint;
?
[WebService(Namespace?="http://tempuri.org/")]
[WebServiceBinding(ConformsTo?=WsiProfiles.BasicProfile1_1)]
publicclassService?:?System.Web.Services.WebService
{
????publicService?()?{
?
????????//Uncomment?the?following?line?if?using?designed?components?
????????//InitializeComponent();?
}
?
????[WebMethod]
????publicstringItemPermission(stringSitePath,?stringLibName,?stringOldUser,?stringNewUser,?stringemail,?stringname)
????{
?
????????stringReturnVal?="";
?
????????try
????????{
????????????SPSite?WebApp?=newSPSite(SitePath);
????????????SPWeb?Site?=WebApp.OpenWeb();
????????????SPList?list?=Site.Lists[LibName];
????????????SPQuery?newSPQuery?=newSPQuery();
????????????newSPQuery.Query?="<Where><Eq><FieldRef?Name=\"Author\"/><Value?Type=\"User\">"+OldUser?+"</Value></Eq></Where>";
????????????SPListItemCollection?listItemCol?=list.GetItems(newSPQuery);
????????????if(listItemCol.Count?>0)
????????????{
????????????????foreach(SPListItem?item?inlistItemCol)
????????????????{
????????????????????SPRoleDefinition?RoleDefinition?=Site.RoleDefinitions.GetByType(SPRoleType.Contributor);
????????????????????SPRoleAssignment?RoleAssignment?=newSPRoleAssignment(NewUser,?email,?name,?"notes");
????????????????????RoleAssignment.RoleDefinitionBindings.Add(RoleDefinition);
????????????????????if(!item.HasUniqueRoleAssignments)
????????????????????{
????????????????????????item.BreakRoleInheritance(true);
????????????????????}
????????????????????item.RoleAssignments.Add(RoleAssignment);
????????????????????item.Update();
????????????????}
????????????}
????????}
????????catch(Exception?ex)
????????{
????????????ReturnVal?+="Permission?not?set,?reason:?"+ex.Message;
????????}
????????returnReturnVal;
????}
????
}
?
?如何使用?
下面展示一個控制臺程序,講述如何使用這個webservice
?
替換下面的字符串
?
<sitepath> with the Full URL of the site
<libname> with the list/library name
<domain> with the domain name
<olduser> with the userid who left the company
<newuser> with the userid to whom you want to give permission
<email of new user> self explaning
<name of new user> self explaning
?
If "<domain>\\<olduser>" does not work try to use the old user’s full name such as “John Smith”.
?
=====================================================
?
using?System;
using?System.Collections.Generic;
using?System.Text;
?
namespace?ConsoleApplication1
{
????class?Program
??? {
????????//localhost.Service newService;
????????static?void?Main(string[] args)
??????? {
??????????? localhost.Service newService =?new?localhost.Service();
??????????? newService.UseDefaultCredentials =?true; //I am assuming an administrator/power user is running this app or use a specific credential here
????????????string?output = newService.ItemPermission("<sitepath>",?"<libname>",?"<domain>\\<olduser>",?"<domain>\\<newuser>","<email of new user>",?"<name of new user>");
????????????Console.WriteLine(output);
????????????Console.ReadLine();
??????? }
??? }
}
?
?
注意:本文介紹的所有代碼都與用戶是緊耦合的,也就是說用戶是死定在代碼里面的,如果真的要滿足現實需求,必須解除這個耦合,MOSS/Sharepoint 控制視圖頁面訪問權限開發的問題(代碼法)?這篇文章是一個例子,你可以使用相同的方法,建立一個列表,這樣用戶的耦合性就被降低了,可以由客戶自己定制。
?
直接給item增加權限,例如編輯權限
?
item.DoesUserHavePermissions(SPBasePermissions.RditListItems)
?
還有一個例子是我從網上找的:
PSite site = listEvent.Site; SPWeb web = site.OpenWeb(); string urlVal = listEvent.WebUrl + "/" + listEvent.UrlAfter; SPFile file = web.GetFile(listEvent.UrlAfter); while (file.CheckOutStatus != SPFile.SPCheckOutStatus.None) {file = web.GetFile(listEvent.UrlAfter); } SPListItem myItem = file.Item;//取消繼承 if (!myItem.HasUniqueRoleAssignments)myItem.BreakRoleInheritance(true); //清除權限 foreach (SPRoleAssignment roleAssignment in myItem.RoleAssignments) {roleAssignment.RoleDefinitionBindings.RemoveAll();roleAssignment.Update(); }SPGroup groupAdmin = web.SiteGroups["項目管理系統管理員"];SPRoleDefinition RoleDefContributor = web.RoleDefinitions.GetByType(SPRoleType.Contributor); SPRoleDefinition RoleDefAdministrator = web.RoleDefinitions.GetByType(SPRoleType.Administrator);SPRoleAssignment RoleAssAdmin = new SPRoleAssignment((SPPrincipal)groupAdmin); SPRoleAssignment RoleAssAuthor = new SPRoleAssignment((SPPrincipal)file.Author);RoleAssAdmin.RoleDefinitionBindings.Add(RoleDefAdministrator); RoleAssAuthor.RoleDefinitionBindings.Add(RoleDefContributor); //重新分配權限 myItem.RoleAssignments.Add(RoleAssAdmin); myItem.Update(); myItem.RoleAssignments.Add(RoleAssAuthor);myItem.Update();using(SPWeb oParentWebsite = SPContext.Current.Site.AllWebs["Site_Name"]) {SPWebCollection collWebsites = oParentWebsite.Webs;SPUser oUser = oParentWebsite.Users["User_Name"];foreach (SPWeb oWebsite in collWebsites){SPRole oRole = oWebsite.Roles["Role_Name"];oRole.RemoveUser(oUser);oWebsite.Dispose();} }?
?
?
?
?
?
轉載:http://www.cnblogs.com/Creator/archive/2010/12/21/1909393.html
?
轉載于:https://www.cnblogs.com/EricLee007/archive/2012/06/07/2540545.html
總結
以上是生活随笔為你收集整理的使用代码设置Item级的权限(权限总结1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iPhone开发资料之内存管理 ,循环引
- 下一篇: [转]Android开发,实现可多选的图