ailiy 发表于 2015-9-26 07:02:47

通过代码解决SharePoint列表视图权限分配问题

  最近被SharePoint列表视图分权限的问题困扰着,在网上搜到些解决方案,比较不错的是Bewise.SharePoint.SPViewPermissionSetting的解决方案,但是在修改视图权限配置的时候经常出问题,不知道是什么原因,后来从codeplex上找到了这个解决方案的源码,下来学习一下,总结如下:
  它是通过自定义WebControl来修改ListViewWebPart的ViewSelector模板实现视图权限过滤的。
  开工:
  第一步、
  先建个ListViewPermissionConfig列表,用来存放视图权限的配置信息。
  列表栏:ListName(单行文本)、ViewName(单行文本)、ViewGuid(单行文本)、Permission(人员或用户组,允许多选)。
  第二步、
  开写代码,示意代码如下:
  

1using System;
2using System.Collections.Generic;
3using System.Text;
4using System.Web.UI;
5
6using Microsoft.SharePoint;
7using Microsoft.SharePoint.WebControls;
8
9namespace ITS.SharePoint.WebControls
10{
11    public class CustomerViewMenu : ViewSelectorMenu
12    {
13      /**//// <summary>
14      /// 用户是否可以查看此时图
15      /// </summary>
16      /// <param name="viewID"></param>
17      /// <param name="userOrGroup"></param>
18      /// <returns></returns>
19      private bool CanSeeView(Guid viewID, SPUser currentUser)
20      {
21            bool b = false;
22            using (SPSite site = new SPSite("http://liust-server:100"))
23            {
24                using (SPWeb icmWeb = site.AllWebs["ITSImportanceCustomerManagement"])
25                {
26                  SPList listViewConfig = icmWeb.Lists["ListViewPermissionConfig"];
27                  string strQuery = string.Format("<Where><Eq><FieldRef Name='ViewGuid' /><Value Type='Text'>{0}</Value></Eq></Where>", viewID.ToString());
28                  SPQuery query = new SPQuery();
29                  query.Query = strQuery;
30
31                  SPListItemCollection items = listViewConfig.GetItems(query);
32                  if (items.Count > 0)
33                  {
34                        foreach (SPListItem item in items)
35                        {
36                            object obj = item["Permission"];
37                            SPFieldUserValueCollection userValues = (SPFieldUserValueCollection)obj;
38                            foreach (SPFieldUserValue value in userValues)
39                            {
40                              //如果value.User非空,则代表当前值是用户,相反则是用户组。
41                              if (value.User != null)
42                              {
43                                    if (currentUser.LoginName.Equals(value.User.LoginName))
44                                        return true;
45                              }
46                              else
47                              {
48                                    //判断当前用户是否在用户组中
49                                    SPGroup group = icmWeb.Groups.GetByID(value.LookupId);
50                                    foreach(SPUser user in group.Users)
51                                    {
52                                        if (currentUser.LoginName.Equals(user.LoginName))
53                                          return true;
54                                    }
55                              }
56                            }
57                        }
58                  }
59                }
60            }
61            return false;
62      }
63
64      protected override void Render(HtmlTextWriter output)
65      {
66            if (this.Visible && !SPContext.Current.Web.CurrentUser.IsSiteAdmin)
67            {
68                foreach (Control item in base.MenuTemplateControl.Controls)
69                {
70                  try
71                  {
72                        if ((item is MenuItemTemplate) && (SPContext.Current.List.Views[((MenuItemTemplate)item).Text]) != null)
73                        {
74                            SPView tempView = SPContext.Current.List.Views[((MenuItemTemplate)item).Text];
75                            if (tempView.DefaultView)
76                              item.Visible = true;
77                            else
78                              item.Visible = this.CanSeeView(tempView.ID, SPContext.Current.Web.CurrentUser);
79                        }
80                  }
81                  catch (Exception) { }
82                }
83                base.Render(output);
84            }
85            else
86            {
87                base.Render(output);
88            }
89      }
90    }
91}
92  
  编译完成后部署到GAC中。
  
  第三部、
  修改DefaultTemplate.ascx文件,在文件头部加入以下代码:

<%@ Register TagPrefix="ITSControls" Assembly="ITS.SharePoint.WebControls, Version=1.0.0.0, Culture=neutral, PublicKeyToken=f6cfe723df0de6cf" namespace="ITS.SharePoint.WebControls" %>  
  接着搜索"SharePoint:ViewSelectorMenu",替换成"<ItsControls:CustomerViewMenu",最终改完效果如下:

<ITSControls:CustomerViewMenu MenuAlignment="Right" AlignToParent="true" runat="server" id="ViewSelectorMenu" />  
  重启IIS后,进入网站,在ListViewPermissionConfig列表中配置一条视图权限信息。
  说明:ViewGuid和Permission两项必须填写,列表默认视图无论是否配置权限都会显示。
  最终配置完的效果如下图:


  
页: [1]
查看完整版本: 通过代码解决SharePoint列表视图权限分配问题