<pre name="code" class="html">
將近年關,不高興做事情,所以研究了一會SharePoint的視圖權限控制,之前網上下了一個MOSS2007的視圖權限wsp包,因爲自己使用的環境主要是sharepoint 2013,所以界面上很不友好,決定自己寫一個視圖權限的東西。在這裏順手記錄下了開發過程中的一些心得和體會,如有不對的地方,還請各位大神多多提點。我這個想法主要基於SharePoint下Web Part的開發。在每個視圖頁面添加一個權限過濾webpart,然後根據本站點的list來判斷權限是否正確。
先通過VS新建了一個sharepoint visual webpart 2013,然後在usercontroller代碼中貼入
public VisualWebPart1 WebPart { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
if (CanSeeView(WebPart.listname, WebPart.viewname, SPContext.Current.Site.OpenWeb().CurrentUser) == false)
{
SPUtility.TransferToErrorPage("您沒有權限訪問此視圖.");
}
}
//// <summary>
/// 用戶是否可以查看此時圖
/// </summary>
/// <param name="viewID"></param>
/// <param name="userOrGroup"></param>
/// <returns></returns>
private bool CanSeeView(string list, string view, SPUser currentUser)
{
try
{
if (view == "test")
{
return true;
}
SPWeb web = SPContext.Current.Web;
SPList listViewConfig = web.Lists["ListViewPermissionConfig"];
string strQuery = string.Format("<Where><And><Eq><FieldRef Name='ListName' /><Value Type='Text'>{0}</Value></Eq><Eq><FieldRef Name='ViewName' /><Value Type='Text'>{1}</Value></Eq></And></Where>", list.ToString(),view.ToString());
SPQuery query = new SPQuery();
query.Query = strQuery;
SPListItemCollection items = listViewConfig.GetItems(query);
if (items.Count > 0)
{
foreach (SPListItem item in items)
{
//SPFieldUserValue[] userValues = item["Permission"] as SPFieldUserValue[];
object obj = item["Permission"];
SPFieldUserValueCollection userValues = (SPFieldUserValueCollection)obj;
foreach (SPFieldUserValue value in userValues)
{
//如果value.User非空,則代表當前值是用戶,相反則是用組。
if (value.User != null)
{
if (currentUser.LoginName.Equals(value.User.LoginName))
return true;
}
else
{
//判斷當前用戶是否在用戶組中
SPGroup group = web.Groups.GetByID(value.LookupId);
foreach (SPUser user in group.Users)
{
if (currentUser.LoginName.Equals(user.LoginName))
return true;
}
}
}
}
}
return false;
}
catch (Exception e){
return false;
}
記得要引用
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;
using Microsoft.SharePoint.Utilities;
然後在Webpart 代碼中貼入
protected override void CreateChildControls()
{
VisualWebPart1UserControl control = Page.LoadControl(_ascxPath) as VisualWebPart1UserControl;
//添加自定義屬性
if (control != null)
{
control.WebPart = this;
}
Controls.Add(control);
}
private string listN = "test";
private string viewN = "test";
[Personalizable(), WebBrowsable]
public string listname
{
get
{
return listN;
}
set
{
listN = value;
}
}
[Personalizable(), WebBrowsable]
public string viewname
{
get
{
return viewN;
}
set
{
viewN = value;
}
}
其實並不困難。期間需要注意的應該是權限表的Permission字段應該允許多選。