设为首页 收藏本站
查看: 640|回复: 0

[经验分享] sharepoint 权限

[复制链接]

尚未签到

发表于 2015-9-28 09:47:39 | 显示全部楼层 |阅读模式
  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的权限提升是将需要具有管理员权限的代码部分放入到如下代码块中运行:
  

DSC0000.gif Code  
  2、权限提升实际模拟的用户是SHAREPOINT\system这个用户,在站点中要确认SHAREPOINT\system这个用户要有足够的权限,否则模拟此用户的程序段执行也会出现没有权限的错误。
  
  3、需要权限提升的代码一定不可以包含程序上下文的信息,否则执行的时候也会出现没有权限的错误,例如下面两个例子:
  

DSC0001.gif
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);//这段代码在执行时如果用户没有权限,则会出现错误。
    }  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-119821-1-1.html 上篇帖子: 如何在启用SharePoint浏览器功能的InfoPath 表单中添加托管代码以动态地加载并显示图片 下篇帖子: 常见的Microsoft SharePoint Server 2010的安装问题和解决
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表