如何使用rest端点获取Sharepoint中文件/文件夹/文档的权限级别?
在尝试获取特定文件/文档的权限级别时,我使用了以下rest端点如何使用rest端点获取Sharepoint中文件/文件夹/文档的权限级别?,rest,sharepoint,permissions,Rest,Sharepoint,Permissions,在尝试获取特定文件/文档的权限级别时,我使用了以下rest端点 https://<web url>/_api/Web/GetFileByServerRelativeUrl('<path to the file>')/getlimitedwebpartmanager(scope=1 or 0) https:///_api/Web/GetFileByServerRelativeUrl(“”)/getlimitedwebpartmanager(范围=1或0) 我能够成功地获
https://<web url>/_api/Web/GetFileByServerRelativeUrl('<path to the file>')/getlimitedwebpartmanager(scope=1 or 0)
https:///_api/Web/GetFileByServerRelativeUrl(“”)/getlimitedwebpartmanager(范围=1或0)
我能够成功地获得该文件。但是我现在应该如何获得权限级别呢?要获得权限级别,我要做的是使用“$expand”查询参数,该参数等于“ListItemAllFields/RoleAssignments/XXXX”,其中XXXX是成员,RoleDefinitionBindings,等等,将链扩展到我需要的用户和权限级别信息。比如说,
.../GetFileByServerRelativeUrl('')?$expand=ListItemAllFields/RoleAssignments/Member,ListItemAllFields/RoleAssignments/RoleDefinitionBindings,ListItemAllFields/RoleAssignments/Member/Users
花了大量的web搜索才发现“$expand”查询参数甚至存在,但在一次get中获取所需的所有信息非常有用。随后,我向查询中添加了一个“$select”参数,以筛选出我的应用程序使用的部分
编辑:
另外,请看下面Radu的问题和我的后续回答。这个问题的答案取决于你想完成什么。引用我的部分答案:
如果您正在挖掘所有用户拥有的所有权限,请使用我的方法。但是,您需要足够的权限来获取该信息。如果您想知道用于发出请求的用户的基本权限,请使用他的方法。我的工作中有两个用例,所以事实上,我两个都做
被接受的解决方案对我不起作用。用户似乎在默认情况下没有查看角色分配的权限。但这就是我最后做的 我获得了来自的响应,从而获得了有效的基本权限 /_api/web/getFileByServerRelativeUrl('my/relative/path')/ListItemAllFields/effectiveBasePermissions 我认为这适用于sharepoint中的任何项目/文件夹(通过将/ListItemAllFields/effectiveBasePermissions附加到url) 因此,这将返回当前用户对该文件/项目的权限。权限“对象”是由35个标志组成的一组,这些标志以64位编码(并非所有64位都使用,仅35位)。这些位由端点提供为两个整数(每个32位),命名为:
- 低-表示前32位
- 高-序列中的下一个32位,最多64位
ViewListItems = 1,
AddListItems = 2,
EditListItems = 3,
DeleteListItems = 4,
ApproveItems = 5,
OpenItems = 6,
ViewVersions = 7,
DeleteVersions = 8,
CancelCheckout = 9,
ManagePersonalViews = 10,
ManageLists = 12,
ViewFormPages = 13,
AnonymousSearchAccessList = 14,
Open = 17,
ViewPages = 18,
AddAndCustomizePages = 19,
ApplyThemeAndBorder = 20,
ApplyStyleSheets = 21,
ViewUsageData = 22,
CreateSSCSite = 23,
ManageSubwebs = 24,
CreateGroups = 25,
ManagePermissions = 26,
BrowseDirectories = 27,
BrowseUserInfo = 28,
AddDelPrivateWebParts = 29,
UpdatePersonalWebParts = 30,
ManageWeb = 31,
AnonymousSearchAccessWebLists = 32,
UseClientIntegration = 37,
UseRemoteAPIs = 38,
ManageAlerts = 39,
CreateAlerts = 40,
EditMyUserInfo = 41,
EnumeratePermissions = 63
正如您所看到的,有些位没有任何意义(如位11、33、34等)
因此,我们需要查看前32位中的第3位(用于编辑),以确定用户是否可以编辑此文件/项目/文件夹。我们可以忽略高位。我们必须与二进制格式的整数进行逐位比较,该整数只有第3位设置为1(其余为0)。在本例中,这是100(这是4的二进制表示)。实际上,这有一个公式:binaryNr=2^(bitIndex-1)。对于我们的示例,bitIndex是3。
现在我们有了binaryNr,我们将其用作掩码,以确定低位序列中的第三位是0还是1:
hasEditingPermission=(binaryNr | LowSequence)=LowSequence
下面是一个方便的伪代码函数(^是幂运算符):
拉杜在他的回答中提出了一个与我在回答中给出的不同的用例。如果您正在挖掘所有用户拥有的所有权限,请使用我的方法。但是,您需要足够的权限来获取该信息。如果您想知道用于发出请求的用户的基本权限,请使用他的方法。我的工作中有两个用例,所以事实上,我两个都做 然而,正如我在Radu的回答中所说,我在使用他的
hasPermission()
函数时遇到了一些问题。我在这里添加了一个新的答案,以提供一个为什么它对我不起作用的例子:
我肯定不是一个专家级的玩弄者,但至少在Java中,1$.ajax({
url:_spPageContextInfo.webAbsoluteUrl+“/_api/web/getFileByServerRelativeUrl(“”)/ListItemAllFields/effectiveBasePermissions”,
键入:“获取”,
标题:{Accept:“application/json;odata=verbose”},
成功:功能(数据){
var permissions=new SP.BasePermissions();
permissions.initPropertiesFromJson(data.d.EffectiveBasePermissions);
var hasppermissions=permissions.has(SP.PermissionKind.当我添加$expand参数时,我得到“2147024891,System.UnauthorizedAccessException”。url不起作用,但它只是下载文件…第二次检查时,不带extend参数的url实际上返回文件元数据,但这还不够。我们如何在sharepoint 2010中实现这一点,因为我们无法在几年后直接使用rest api。这对于sharepoint Online仍然是功能性的和有用的。确实,您是rect.在我给出的示例中,我正在以具有足够凭据的用户身份挖掘所有用户的权限信息。如您所示,我还使用各种/effectiveBasePermissions
组合(web、列表、文件、文件夹)用于为其凭据被用于进行REST调用的用户获取该信息。我的一个区别在于hasPermission()
。我使用与上面显示的代码完全相同的代码,但我使用:return(sequence&(1我不明白…1 Radu,我在下面添加了一个额外的答案来讨论hasPermission()
@ThomasDoman误解是运算符^。我指的是power运算符。我编辑了答案以澄清这一点。^在JAVA中代表XOR…当然不起作用。谢谢Radu!只是好奇,作为power运算符,^使用的是什么语言?我觉得你的代码看起来像JavaScript,但在JavaScript中它也是XOR。或者,base在你的编辑中,它只是纯粹的伪代码吗?
function hasPermission (low, high, bitIndex){
var sequence = low;
if (bitIndex >= 32){
sequence = high;
bit -= 32;
}
return ((2^(bitIndex - 1)) | sequence) == sequence
}
$.ajax({
url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/getFileByServerRelativeUrl('<your file or folder url>')/ListItemAllFields/effectiveBasePermissions",
type: "GET",
headers: { Accept: "application/json;odata=verbose" },
success: function(data){
var permissions = new SP.BasePermissions();
permissions.initPropertiesFromJson(data.d.EffectiveBasePermissions);
var hasPermissions = permissions.has(SP.PermissionKind.<any level to check>);
//for example: var bool_has_editListItems = permissions.has(SP.PermissionKind.editListItems);
}
});