问题背景:某网站下存在两个列表库,用户Test1对List1具有参与讨论权限,用户Test2对List2具有参与讨论权限;而这两个用户对其他列表均只有读取权限;
问题内容:要求Test1每对List1添加一项,则List2 也增加一项相关的记录;
问题关键:SPItemEventRevicer,SPSecurity.RunWithElevatedPrivileges
解决:
自定义类,继承类SPItemEventRevicer,实现 ItemAdded方法,在对List1添加完一项之后,将该项的ID保存,同时在List2中新建一项,将ID值赋予。
在对List2进行写入操作时,由于当前HttpContext的用户是test1,所以会出现异常。所以要用到SPSecurity.RunWithElevatedPrivileges,临时以system身份运行。需要注意的是:此时要取到List2,是不能直接用当前的SPWeb或者其他对象的,因为这些对象的权限仍旧是Test1的权限,需要新建实例。
另外,在以system身份运行中,如果觉得权限过大,可以进行其他身份模拟;即:在新建一个SPSite对象的时候,把某个用户SPUser的UserToken用户信息赋值给SPSite对象,则该SPSite对象的所有操作都以该模拟用户身份进行。
代码:
在SPSecurity.RunWithElevatedPrivileges()中的代码以system身份运行,也可模拟其他用户身份。
SPUser user = site.RootWeb.SiteUsers["sharepointweb\\user1"];
//利用用户Token构造新的Site对象
SPSite siteWithUser = new SPSite(siteUrl, user.UserToken);
此后SPSite则会以User1的身份进行运行。