我正在创建一个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");
}
}
}
我认为只要您的安全上下文有意义(即安全性最低的用户可以使用这些方法访问列表项),第一个类看起来就不错。我很好奇第二个中的 using 语句如何影响调用它的代码。
ElevatePriveleges 的问题在于,有时当您拥有广泛使用的数据访问代码时,如果您不想直接在 SharePoint UI 中授予对列表的访问权限,但希望在其上下文中执行的代码访问用户控件等的列表项,则很多时候必须提升权限。
要记住的几件事: 1. 始终通过 SharePoint 中的列表访问代码识别内存泄漏。在您的类中,您很好地处理了这两种情况,以及处理任何 SPRequest 处置。 2. 你几乎从不想在你的代码中使用 SPList.Items 。如果以这种方式显示列表,并且不管理调用列表的代码,则在调用 .Items 属性(而不是特定查询)加载该列表中每个项的每个可能的项和字段。
希望这有帮助