解读Document Library关于权限的对象模型
Document Library的权限默认是从站点继承的,我们可以手工修改这些权限,首先要切断权限的继承关系,然后
,可以修改任何一个组对当前List的权限:
下面我介绍如何在代码中修改一个document library的权限:
首先看一个实例:
当点击Lock时,设置这个document library对所有Group/User是只读的(不包括站点Owners),当点击Resume时,恢复每一个Group/User的对这个list的原始权限。
效果图:
锁定后:
恢复权限后:
从菜单的变化中我们可以看出权限的变化。
核心代码如下:
1 SPWeb currentWeb = SPContext.Current.Web;
2 SPListCollection lists = currentWeb.GetListsOfType(SPBaseType.DocumentLibrary);
3 SPList list = lists[this.docLibName];
4 //判断是否已经切断继承关系,没有的话,切断继承关系,并从父站点拷贝权限。
5 //如果不切断继承,是不能修改它的权限的
6 if (!list.HasUniqueRoleAssignments)
7 {
8 list.BreakRoleInheritance(true);
9 }
10 //遍历list权限中所有Groups/Users,也就是在权限列表里的所有Groups/users
11 foreach (SPRoleAssignment ra in list.RoleAssignments)
12 {
13 SPPrincipal sp = ra.Member;
14 //获取一个Group/User,对站点Owners这个组操作是无效的,他们始终有FullControl的权限
15 if (!sp.Name.Contains("Owners"))
16 {
17 //遍历该Group/User的所用有地权限
18 foreach (SPRoleDefinition roleDefinition in ra.RoleDefinitionBindings)
19 {
20 //Limited Access比较特殊,它不会被Remove掉
21 if (roleDefinition.Name != "Limited Access")
22 {
23 //备份当前的权限
24 SPListItem newItem = original.Items.Add();
25 newItem["Title"] = sp.Name;
26 newItem[ColumnPermission] = roleDefinition.Name;
27 newItem.Update();
28 }
29 }
30
31 //remove all permissions of the group
32 ra.RoleDefinitionBindings.RemoveAll();
33
34 //获取站点所有的Permissions
35 SPRoleDefinitionCollection roles = currentWeb.RoleDefinitions;
36 //获取Read权限
37 SPRoleDefinition viewRoleDefinition = roles["Read"];
38 //判断这个Group/User是否已经包含Read权限,如果不包含就添加Read权限
39 if (!ra.RoleDefinitionBindings.Contains(viewRoleDefinition))
40 {
41 ra.RoleDefinitionBindings.Add(viewRoleDefinition);
42 ra.Update();
43 }
44 }
45 }
2 SPListCollection lists = currentWeb.GetListsOfType(SPBaseType.DocumentLibrary);
3 SPList list = lists[this.docLibName];
4 //判断是否已经切断继承关系,没有的话,切断继承关系,并从父站点拷贝权限。
5 //如果不切断继承,是不能修改它的权限的
6 if (!list.HasUniqueRoleAssignments)
7 {
8 list.BreakRoleInheritance(true);
9 }
10 //遍历list权限中所有Groups/Users,也就是在权限列表里的所有Groups/users
11 foreach (SPRoleAssignment ra in list.RoleAssignments)
12 {
13 SPPrincipal sp = ra.Member;
14 //获取一个Group/User,对站点Owners这个组操作是无效的,他们始终有FullControl的权限
15 if (!sp.Name.Contains("Owners"))
16 {
17 //遍历该Group/User的所用有地权限
18 foreach (SPRoleDefinition roleDefinition in ra.RoleDefinitionBindings)
19 {
20 //Limited Access比较特殊,它不会被Remove掉
21 if (roleDefinition.Name != "Limited Access")
22 {
23 //备份当前的权限
24 SPListItem newItem = original.Items.Add();
25 newItem["Title"] = sp.Name;
26 newItem[ColumnPermission] = roleDefinition.Name;
27 newItem.Update();
28 }
29 }
30
31 //remove all permissions of the group
32 ra.RoleDefinitionBindings.RemoveAll();
33
34 //获取站点所有的Permissions
35 SPRoleDefinitionCollection roles = currentWeb.RoleDefinitions;
36 //获取Read权限
37 SPRoleDefinition viewRoleDefinition = roles["Read"];
38 //判断这个Group/User是否已经包含Read权限,如果不包含就添加Read权限
39 if (!ra.RoleDefinitionBindings.Contains(viewRoleDefinition))
40 {
41 ra.RoleDefinitionBindings.Add(viewRoleDefinition);
42 ra.Update();
43 }
44 }
45 }
主要类解释如下:
SPRoleAssignment:代表一个Group/User的类
SPRoleDefinition:代表一个权限的类
foreach (SPRoleAssignment ra in list.RoleAssignments)
RoleAssignments是此list中所有Group/User的集合。
ra.RoleDefinitionBindings.RemoveAll();
RoleDefinitionBindings是某一个Group/User所拥有的权限集合。
SPRoleDefinitionCollection roles = currentWeb.RoleDefinitions;
RoleDefinitions是站点权限的集合。也就是下图,需要注意一点,WSS和MOSS是有区别的。