我正在创建一个SharePoint应用程序,并且希望尽可能经常地以正确的方式执行操作。
我正在站点定义中部署一系列列表,我想将数据访问锁定到一系列Get()方法以维护约定。
我的一些列表在列表定义中设置了SecurityBits =“22”,因为我希望仅在UI中修改列表项条目。
我想避免滥用SPSecurity.RunWithElevatedPrivileges
。我还想回避SPSecurity.RunWithElevatedPrivileges
的限制,你可以在代表中使用return
函数。
这似乎是强制执行此操作的好方法。如果您要调用列表来获取具有正常安全性的列表项,则可以调用var PostList = CoreLists.Posts
。如果您需要使用提升的权限调用相同的列表,则可以调用var PostList = CoreLists.SystemAccount.Posts
这是一个很好的方法吗?
public static class CoreLists
{
public static SPList Posts()
{
return SPContext.Current.Web.GetList(SPContext.Current.Web.ServerRelativeUrl + "/lists/CommunityPost");
}
public static class SystemAccount
{
public static SPList Posts()
{
using (var elevatedSite = new SPSite(SPContext.Current.Site.ID, SPContext.Current.Site.SystemAccount.UserToken))
using (var web = elevatedSite.OpenWeb())
return web.GetList(web.ServerRelativeUrl + "/lists/CommunityPost");
}
}
}
答案 0 :(得分:1)
我认为只要您的安全上下文有意义(即安全性最低的用户可以使用这些方法访问列表项),第一个类看起来很好。我很好奇第二个中的using语句如何影响代码调用它。
使用ElevatePriveleges时,有时当您拥有广泛使用的数据访问代码时,如果您不希望直接在SharePoint UI中授予他们对列表的访问权限,则很多时候您必须提升权限,但希望在其上下文中执行代码访问用户控件等的列表项。
要记住几件事: 1.始终了解SharePoint中列表访问代码的内存泄漏。在您的课程中,您处理两种情况都可以处理任何SPRequest处理。 2.您几乎不想在代码中使用SPList.Items。如果您以这种方式表示列表并且您没有管理调用列表的代码,则可能会遇到更大列表的性能问题,因为调用.Items属性而不是特定查询,会为每个项目加载每个项目和字段。那份清单。
希望这会有所帮助