Как узнать разрешения для каждого элемента дерева (папки или файла) для другого пользователя с помощью API Sharepoint?

Я хочу получить ответ на вопрос:

Может ли userA читать папку/дерево?

Приложение использует другого пользователя для связи с Sharpoint через API Sharepoint.

Я погуглил следующий запрос:

http://aissp2013/sites/Team/_api/web/lists/getbytitle('L2')/EffectiveBasePermissions

Но это не решает мою проблему, потому что отвечает разрешениями для текущего пользователя!

  1. Есть ли способ получить разрешения для другого пользователя для конкретного элемента (папки, файла или библиотеки)
  2. Есть ли способ получить разрешения для другого пользователя для всех элементов и подэлементов?

person gstackoverflow    schedule 16.08.2018    source источник


Ответы (1)


Чтобы получить разрешения для каждого пользователя SP.ListItem.getUserEffectivePermissions метод предназначен:

для SP.Folder

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

для SP.File

Url /_api/web/getFileByServerRelativeUrl('<file-rel-url>')/ListItemAllFields/getusereffectivepermissions(@u)?@u='<account>'
Method: Get

Примечание. Параметр account должен быть указан в формат претензий

Что касается вопроса:

Может ли пользователь А читать папку/дерево?

следующий пример демонстрирует, как получить разрешения для папки

 const accountName = "i:0#.f|membership|<name>@<tenant>.onmicrosoft.com"; 

  let endpointUrl = _spPageContextInfo.webAbsoluteUrl + "/_api/web/getFolderByServerRelativeUrl('/Shared Documents/Achive')/ListItemAllFields/getusereffectivepermissions(@u)?@u='" + encodeURIComponent(accountName) + "'";
  const content = await executeJson(endpointUrl);

  let roles = parseBasePermissions(content.d.GetUserEffectivePermissions);
  if(roles.viewListItems)
     console.log(`${accountName} has been granted permissions.`);

куда

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; 
}

используется для разбора маски разрешений на роли

а также

async function executeJson(url,options) {
    options = options || {};
    options.method = options.method || 'GET';
    options.headers = options.headers || {};
    options.headers["Accept"] = "application/json;odata=verbose";
    options.headers["Content-Type"] = "application/json;odata=verbose";
    if(options.method == "POST") {
        options.headers["X-RequestDigest"] = document.getElementById("__REQUESTDIGEST").value;
    }    
    if (options.body) {
       options.body = JSON.stringify(options.body);
    }  
    const rawResponse = await fetch(url,options);
    const content = await rawResponse.json();
    return content;
}

выполнить REST-запрос

person Vadim Gremyachev    schedule 16.08.2018
comment
спасибо - фантастический ответ. Но у меня есть еще один вопрос. Если я правильно понял ваш ответ - предоставленный вами запрос позволяет мне узнать разрешения для конкретной папки или файла. В моем случае это неудобно, потому что мне нужно знать права доступа к каждому элементу дерева. Не рекомендуется выполнять вызов rest для каждого элемента в библиотеке из-за производительности. Есть ли способ выполнить одиночный вызов rest, чтобы узнать разрешения для полного дерева? - person gstackoverflow; 17.08.2018
comment
также я использую java для связи с sharepoint, поэтому у меня нет объекта javascript SP.PermissionKind для анализа разрешений - person gstackoverflow; 17.08.2018