sharepoint 权限

SPRoleAssignment用于权限的分配,它比较简单,只有三个public的属性:

Member:把权限分配给谁
Parent:在什么东西上分配权限
RoleDefinitionBindings:分配什么权限
从最后一个东西的名字上来看,在2007里,权限的分配其实已经变成了角色的绑定
依次看一下上面这三个东西
Member是SPPrincipal类型的(它其实相当于2003里的SPMember),是SPUser和SPGroup的父类
Parent:一个实现了ISecurityxxxx接口的东东(估计2007里能分配权限的类都实现了这个接口)
RoleDefinitionBindings:可以理解为SPRoleDefinition的一个集合(虽然在对象模型上有点区别)

在2007里面
每一个能分配权限的东西(SPWeb、SPList、SPListItem等)都会有一个RoleAssignments属性,它是一个SPRoleAssignmentCollection类型的属性,用于分配权限
此外,在SPWeb里还有RoleDefinitions属性(只在SPWeb里有,也就是说角色只能定义在网站里)

举个例子,
比如我们要给一个用户(user)分配一个在列表(list)上的权限,权限使用了一个名叫“xxx”的角色
代码如下:

SPRoleAssignment ra = new SPRoleAssignment(user); SPRoleDefinition rd = web.RoleDefinitions[ " xxx " ]; ra.RoldDefinitionBindings.Add(rd); list.RoleAssignments.Add(ra);


又比如,修改一个用户的权限:

SPRoleAssignment ra = list.RoleAssignments.GetAssignmentByPrincipal(user); SPRoleDefinition rd = web.RoleDefinitions[ " xxx " ]; ra.RoldDefinitionBindings.Add(rd); ra.Update();

但是,如果这个列表的权限之前是继承自网站的,
那么上面的代码并不会自动的修改这种继承,反而会抛出异常
我们必须手工解除这种继承关系:

list.BreakRoleInheritance( true );


参数中true的意思是把继承下来的权限重新copy过来(如果你不改它的话,它和网站的权限还是一样的),如果是false,则使用列表模版中定义的默认权限(这个我没试过)

如果要新建一个角色的话,直接new一个SPRoleDefinition,改改它的Name、Description、BasePermissions属性,然后再加到web.RoleDefinitions里就可以了;或者在new的时候可以选择一个现有的角色copy过来,再改一改。这个代码我就不写了

此外,在权限方面还有一些其他的小改动:
在2003里,使用xxx.Permissions得到xxx(可以是SPWeb、SPList)的权限,但是在2007里Permissions属性也被废弃了
我们记得Permissions有一个非常有用的东西叫DoesUserHavePermissions来判断当前用户权限的,
在Permissions属性被废弃掉之后,这个方法移植到了SPWeb、SPList等类里
直接使用list.DoesUserHavePermissions就ok了
而且,现在这个方法不仅可以判断当前用户的权限,也可以判断指定用户的权限(通过SPUser)
另外,SPWeb、SPList及SPListItem也加入了CheckPermissions方法来判断用户权限,如果没有则丢一个异常出来,这和以前的xxx.Permissions.Demand方法是一致的 
 

///

In the ItemAdded-Event, you can add RoleDefinitions for each Item in the List, with the following code. The grants the person in the field Mitarbeiter as reader and in the field Vorgesetzter and Personalabteilung as Contributor. So they can also write values. The view is also filtered by these settings. 

SPListItem item = properties.ListItem;
SPWeb web = properties.OpenWeb();
SPUser user = web.EnsureUser((new SPFieldLookupValue(item["Mitarbeiter"].ToString())).LookupValue);
SPUser vorgesetzter = web.EnsureUser((new SPFieldLookupValue(item["Vorgesetzter"].ToString())).LookupValue);
SPUser personalAbteilung = web.EnsureUser((new SPFieldLookupValue(item["Personalabteilung"].ToString())).LookupValue);
SPRoleDefinition RoleDefReader = web.RoleDefinitions.GetByType(SPRoleType.Reader);
SPRoleDefinition RoleDefWriter = web.RoleDefinitions.GetByType(SPRoleType.Contributor);
SPRoleAssignment RoleAssReader = new SPRoleAssignment((SPPrincipal)user);
SPRoleAssignment RoleAssWriter = new SPRoleAssignment((SPPrincipal)vorgesetzter);
SPRoleAssignment RoleAssWriter2 = new SPRoleAssignment((SPPrincipal)personalAbteilung);
RoleAssReader.RoleDefinitionBindings.Add(RoleDefReader);
RoleAssWriter.RoleDefinitionBindings.Add(RoleDefWriter);
RoleAssWriter2.RoleDefinitionBindings.Add(RoleDefWriter);
if (!item.HasUniqueRoleAssignments)
item.BreakRoleInheritance(
false);
item.RoleAssignments.Add(RoleAssReader);
item.RoleAssignments.Add(RoleAssWriter);
item.RoleAssignments.Add(RoleAssWriter2);
item.Update();

 

最近正在研究MOSS列表的权限,基于一个任务列表,在新建一个任务的时候自动为被分配人员分配查看、编辑当前任务的权限。解决这个问题使用了moos的EventHandler,一切都搞定后,使用管理员测试感觉还不错,结果换了用户以后发现代码不好使了,于是开始寻找原因(由于用户权限的问题),从网上查了很多关于MOSS提升的文章,又学到了不少知识,哈哈。下面是我学习过程中的一些记录:

 

1、moss的权限提升是将需要具有管理员权限的代码部分放入到如下代码块中运行:

 

Code

 

2、权限提升实际模拟的用户是SHAREPOINT\system这个用户,在站点中要确认SHAREPOINT\system这个用户要有足够的权限,否则模拟此用户的程序段执行也会出现没有权限的错误。

 

3、需要权限提升的代码一定不可以包含程序上下文的信息,否则执行的时候也会出现没有权限的错误,例如下面两个例子:

 


SPSecurity.RunWithElevatedPrivileges(delegate()
    {
        SPWeb currentWeb = SPContext.Current.Web;
        currentWeb.BreakRoleInheritance(true);//这段代码在执行时如果用户没有权限,则会出现错误。
    }

//下面这样就不会出现错误。
SPSecurity.RunWithElevatedPrivileges(delegate()
    {
        SPSite site = new SPSite(SPContext.Current.Web.Site.Url);//使用上下文对象得到SPSite的url,并new出一个SPSite对象,这样就脱离了上下文的信息。
        SPWeb currentWeb = site.AllWebs[SPContext.Current.Web.Name];
        currentWeb.BreakRoleInheritance(true);//这段代码在执行时如果用户没有权限,则会出现错误。
    }

 

转载于:https://www.cnblogs.com/EricLee007/archive/2012/06/07/2540501.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值