让SharePoint的页面只显示与当前用户相关的数据的几种方案

在使用SharePoint默认生成的AllItem.aspx页面时,对于列表的数据的显示是显示所有的数据的,例如对于Task列表显示所有的Task的列表项。但是,在一般的业务应用中,可能不能满足需求,例如:对于分配的任务,只要求当前登录的用户看到自己的相关任务,其它人的任务不需要被当前登录的用户看到,或者不允许被看到。这里我列举几种处理的方案:

  1. 使用视图来过滤:制定所有需要的视图,且将每个视图的过滤条件都加相关的人员过滤,例如Assign To=[Me]。但是这种方案的问题在于要么将All Items这个视图也要加上相应的条件,要么使用JS来控件在展现数据时将All Items根据当前用户来动态决定是否需要移除,操作上有些麻烦。
  2. 使用Current User Filter部件与相关的ListViewWebPart做关联:使用这种方案比较简单,对于ListView中的所有视图均不需要添加对于人员的过滤,只需要将Current User Filter与相应的ListView进行关联即可。但问题在于,所有的数据项都被与当前的用户相关联了,即使用权限查看所有数据的用户也不能看到全部数据。
  3. 自定义新的表单,使用DataView而不是ListViewWebPart进行数据展现:可以完全自己限定条件,但是需要另外开发页面,弊端是开发工作量增加。
  4. 使用VS创建完全独立的表单来展现数据:完全脱离SharePoint的相关组件,只把SharePoint作为服务来使用,与第3种方法的方法原则上是相同的,弊端同样是开发工作量增加。
  5. 使用第三方组件:http://www.sharepointboost.com/columnpermission.html上提供了对视图和列进行授权的方案基本上满足了一般的需求,弊端嘛就是收费和不开源,呵呵。
  6. 将列表项的权限打破对父项的继承:从安全性的角度以及SharePoint提供的安全机制(对于数据项提供安全授权而不是表单)来说,这是最为安全、最完美的方案,因为其它方案只是在界面上限制了用户的查看,而如果通过其它手段,例如链接、全文查找等依然有可能会查看到不符合权限要求的数据。但是此种方案要么要通过在工作流中的活动来对数据项进行相应的授权(默认没有,在http://www.codeplex.com/SPDActivities有下载,当然也可以自己开发一个),要么通过EventReceiver来实现,不但实现复杂,而且对于基于数据项这种细粒度的权限管理本身就是相当的复杂的,将来权限需要变动时就需要批量对列表项进行更新,打破了“组”的方式进行授权的最佳实践。

以上6种方案都各有利弊,需要在实践中根据不同的需求进行选择使用。由于我也是刚接触SharePoint没有多少时间,给出的结论不保证是正确的,仅供参考和我个人的记录。

 

补充,今天在http://bbs.msiw.net/逛的时候看到了jianyi大侠发起的开源项目,CodeArt SharePoint(http://sppex.codeplex.com/)实现了第5个方案中类似的功能,真的是解决了我的一大难题啊。由于现在还没有把精力放在开发上,所以还看不懂代码,经过测试是可以满足要求的,但是前提还是不会变的,因为只是在界面层限的视图是否可见,如果用全文检索(或者直接的链接,如查看工作流)依然会将未向当前登录用户授权的项目检索出来,所以还是要注意一下应用的场合。

posted @ 2010-01-07 14:40  吴东雷  阅读(542)  评论(0编辑  收藏  举报