如何在Java中解析/获取SharePoint响应的用户有效权限?

3

我有一个像这样的SharePoint请求:

/_api/web/getFolderByServerRelativeUrl('<folder-rel-url>')/ListItemAllFields/getusereffectivepermissions(@u)?@u='<account>'

响应如下:
<d:GetUserEffectivePermissions m:type="SP.BasePermissions">
    <d:High m:type="Edm.Int64">176</d:High>
    <d:Low m:type="Edm.Int64">138612833</d:Low>
</d:GetUserEffectivePermissions>

我不理解它的含义。

我找到了一些代码示例,说明如何解析它,但这些代码是用JavaScript编写的,并使用特殊的对象(SP.BasePermissions)。

function parseBasePermissions(value)
{      
    let permissions = new SP.BasePermissions();
    permissions.initPropertiesFromJson(value);
    let result = {};
    for(var levelName in SP.PermissionKind.prototype) {
        if (SP.PermissionKind.hasOwnProperty(levelName)) {
            var permLevel = SP.PermissionKind.parse(levelName);
            if(permissions.has(permLevel))
                result[levelName] = true;
            else
                result[levelName] = false;
        }     
    }
    return result; 
}

如何正确解析?我想知道用户是否能读取该文件夹。
1个回答

6

相关内容:

我不理解这是什么意思。

SP.ListItem.getUserEffectivePermissions 方法 返回:

指定一组权限的枚举值的按位组合。

该示例演示了如何解析 SP.BasePermissions 值并确定用户是否被授予阅读项目的权限:

BasePermissions permissions = new BasePermissions(138612833L,176L);
String[] roles = permissions.parse();
if(Arrays.asList(roles).contains("ViewListItems"))
    System.out.println("User has permissions to read items");

PermissionKindBasePermissions 类在某种程度上相当于 SharePoint Client SDK 中的 BasePermissionsPermissionKind 类:

import java.util.ArrayList;
import java.util.List;

public class BasePermissions {

    private final long low;
    private final long high;

    public BasePermissions(long low, long high) {
        this.low = low;
        this.high = high;
    }

    public String[] parse() {
        List<String> result = new ArrayList<>();
        for (PermissionKind value : PermissionKind.values()) {
            if(has(value)){
                result.add(value.toString());
            }
        }
        return result.toArray(new String[0]);
    }

    public Boolean has(PermissionKind perm)
    {
       switch (perm)
        {
            case EmptyMask:
                return true;
            case FullMask:
                if ((this.high & 32767) == 32767)
                    return this.low == 65535;
                return false;
            default:
                long n = perm.getValue() - 1;
                long val = 1;
                if (n >= 0 && n < 32)
                    return 0 != (this.low & (val << n));
                if (n >= 32 && n < 64)
                    return 0 != (this.high & (val << n - 32));
                return false;
        }
    }
}

and

public enum PermissionKind {
    EmptyMask(0),
    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),
    FullMask(65);


    PermissionKind(long value) {
        this.value = value;
    }

    public long getValue() { return value; }

    private final long value;
}

2
这是整个互联网上唯一的好答案。 - Nicholas DiPiazza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接