解读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

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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是有区别的。