如何使用休息端点获取Sharepoint中的文件/文件夹/文档的权限级别?

时间:2014-03-08 01:56:44

标签: rest sharepoint permissions

我在尝试获取特定文件/文档的权限级别时使用以下休息结束点。

https://<web url>/_api/Web/GetFileByServerRelativeUrl('<path to the file>')/getlimitedwebpartmanager(scope=1 or 0)

我能够成功获取该文件。但是我现在应该如何掌握权限级别呢?

4 个答案:

答案 0 :(得分:7)

我如何获得权限级别是使用&#34; $ expand&#34;查询参数等于&#34; ListItemAllFields / RoleAssignments / XXXX&#34;其中XXXX是Member,RoleDefinitionBindings等扩展链,只要我需要获取我需要的用户和权限级别信息。例如,

.../GetFileByServerRelativeUrl('')?$expand=ListItemAllFields/RoleAssignments/Member,ListItemAllFields/RoleAssignments/RoleDefinitionBindings,ListItemAllFields/RoleAssignments/Member/Users

需要进行大量的网络搜索才能发现&#34; $ expand&#34;查询参数甚至存在,但它对于获取一个GET中所需的所有信息非常有用。我随后添加了一个&#34; $ select&#34;查询的参数,只过滤掉我的应用程序使用的部分。

修改 另请参阅Radu的问题和我在下面的后续答案。问题的答案取决于你想要完成的事情。引用我的部分答案:

  

如果您正在挖掘所有用户拥有的所有权限,请使用我的方法。但是,您需要足够的权限才能获取该信息。如果您想知道您用来发出请求的用户的基本权限,请使用他的方法。我在工作中都有两个用例,所以我实际上都是这两个。

答案 1 :(得分:3)

接受的解决方案对我不起作用。默认情况下,用户似乎没有权限查看RoleAssignments。但这就是我最终做的事情。

我通过获取响应来获取有效的BasePermissions / _api /网络/ getFileByServerRelativeUrl( '我/相对/路径')/ ListItemAllFields / effectiveBasePermissions

我认为这适用于sharepoint中的任何项目/文件夹,方法是将/ ListItemAllFields / effectiveBasePermissions附加到网址上

因此,这将返回当前用户对该文件/项目的权限。权限“对象”是一组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

这里有一个方便的伪代码函数(^是幂运算符):

function hasPermission (low, high, bitIndex){
  var sequence = low;
  if (bitIndex >= 32){
    sequence = high;
    bit -= 32;
  }
  return ((2^(bitIndex - 1)) | sequence) == sequence
}

答案 2 :(得分:0)

Radu在回答一个不同的用例时提出了一个很好的观点,而不是我在回答中给出的。如果您正在挖掘所有用户的所有权限,请使用我的方法。但是,您需要足够的权限才能获取该信息。如果您想知道用于发出请求的用户的基本权限,请使用他的方法。我在工作中都有两个用例,所以我实际上都是这两个。

然而,正如我在回答中对Radu所说的那样,我在使用他的hasPermission()函数时遇到了一些麻烦。我在这里添加一个新答案,以提供一个为什么它对我不起作用的例子:

我绝对专家位twiddler但是,至少在Java中,1 << (bitIndex-1)与Radu在他的评论中断言的2 ^ (bitIndex-1)不等同。也许整体表达式旨在完成同样的事情,所以这里是一个例子,我发现XOR方法对我不起作用。

<强> 实施例 用户拥有的权限对应于权限列表“受限访问”(低= 134287360)。我想检查用户是否具有“打开”权限,位17.在二进制中,低值(在hasPermission()中变为“序列”)是1000000000010001000000000000。如您所见,第17位已设置。运行表达式((2^(bitIndex - 1)) | sequence)会产生1000000000010001000000010010,显然不等于从true获得hasPermission()响应所需的序列。

因此,如果没有理解或确切知道Radu的XOR方法究竟是什么,我决定使用更直接,更迟钝的方式来测试一点点的存在。像这样:return (sequence & (1 << (bitIndex - 1))) != 0;取1并将bitIndex-1空格向左移动然后做一个按位而不仅使我明白我想要完成的事情,但它也适用于我所做的每一个案例测试

正如我所说的那样,我不会有点笨拙,我简要地考虑了签名值是否存在问题等等(我使用的是高和低的整数)但是我认为我的方法确实不会受到任何影响因为我没有自己改变整数,而我逻辑的其余部分只是按位。

答案 3 :(得分:0)

$.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);
    }
});

要查看更多级别,请参阅SP.PermissionKind list