Пользователь является частью группы AD, вложенной в группу SharePoint, как связать пользователя объявления с группой SharePoint

Мы добавили группу AD в группу пользователей SharePoint. Теперь, когда мы входим в систему с пользователем, мы хотим проверить разрешение для вошедшего в систему пользователя AD.

  1. Я добавил менеджеров группы объявлений (пример) в SharePoint.
  2. Теперь я хочу показать некоторые URL-ссылки только для группы (менеджеров).
  3. Когда пользователь вошел в систему, как я могу проверить, является ли пользователь менеджером или нет? (Используя CSOM или JSOM)

person Ajay Nikam    schedule 16.10.2015    source источник
comment
Можете уточнить еще? Вы добавили активную группу каталогов в (пример) группу уровня разрешений SharePoint «Посетители сайта». Теперь вы хотите проверить разрешения для чего, где и когда? И как? программно или настройка админки SharePoint что ли?   -  person Eric    schedule 16.10.2015
comment
1) Я добавил менеджеров группы объявлений (пример) в SharePoint. 2) Теперь я хочу показать некоторые URL-ссылки только для группы (менеджеров). 3) Когда пользователь вошел в систему, как я могу проверить, является ли пользователь менеджером или нет? (Используя CSOM или JSOM)   -  person Ajay Nikam    schedule 16.10.2015
comment
Для этого сценария вам не нужно самостоятельно проверять членство в группе; вы можете использовать встроенную функцию SharePoint, называемую таргетингом на аудиторию, чтобы ограничить круг лиц, которые могут видеть отдельные веб-части на странице.   -  person Thriggle    schedule 16.10.2015
comment
Это SharePoint Online или локально? Ваша цель - добавить ссылку в навигацию SharePoint (вверху или при быстром запуске) или пользовательскую ссылку в другом месте?   -  person Massimo Prota    schedule 16.10.2015


Ответы (1)


К сожалению, SPGroup.ContainsCurrentUser, которое вы бы использовали для этого в серверном коде, недоступно через клиентскую объектную модель JavaScript (по крайней мере, не в SP2010 и 2013).

Вариант 1. Используйте видимость членства в группе как временное решение

Один из возможных обходных путей - использовать комбинацию двух свойств, к которым вы можете получить доступ в группах через клиентскую объектную модель JavaScript: OnlyAllowMembersViewMemberhip и CanCurrentUserViewMembership.

Если текущий пользователь может просматривать членство в группе для группы, которая разрешена только членам группы, мы можем предположить, что пользователь является членом группы.

var clientContext = new SP.ClientContext();
var groupId = 5; // the group membership ID for the group you want to check
var group = clientContext.get_web().get_siteGroups().getById(groupId);
clientContext.load(group,"CanCurrentUserViewMembership");
clientContext.load(group,"OnlyAllowMembersViewMembership");
clientContext.executeQueryAsync(
    function(sender,args){
        var isMemberOfGroup = group.get_canCurrentUserViewMembership() && group.get_onlyAllowMembersViewMembership();
        if(isMemberOfGroup){
            doSomething();
        }
    },
    function(sender,args){alert("Whoops! "+args.get_message());}
);

Этот подход будет работать только в том случае, если вы настроили группы так, чтобы они были видны только участникам, и он всегда будет возвращать ложное срабатывание, если у вас есть повышенный доступ, например, если вы являетесь администратором семейства веб-сайтов или владельцем группы.

Как пройтись по всем группам сайтов

Если вы хотите применить приведенную выше логику для проверки членства текущего пользователя во всех группах на сайте (вместо указания группы по ее идентификатору), вы можете использовать измененный код JavaScript ниже.

var clientContext = new SP.ClientContext();
var groups = clientContext.get_web().get_siteGroups()
clientContext.load(groups,"Include(CanCurrentUserViewMembership,OnlyAllowMembersViewMembership,Title)");
clientContext.executeQueryAsync(
function(sender,args){
    var groupIterator = groups.getEnumerator();
    var myGroups = [];
    while(groupIterator.moveNext()){
        var current = groupIterator.get_current();
        var isMemberOfGroup = current.get_canCurrentUserViewMembership() && current.get_onlyAllowMembersViewMembership();
        if(isMemberOfGroup){
            myGroups.push(current.get_title()); // this example adds group titles to an array
        }
    }
    alert(myGroups); // show the array
},function(sender,args){"Whoops! "+alert(args.get_message());});

Вариант 2. Используйте таргетинг на аудиторию как обходной путь

Для ваших требований вам может даже не потребоваться программный доступ к членству в группе. Вы можете просто установить таргетинг на аудиторию в веб-частях, которые должны быть видны только определенным группам; таргетинг на аудиторию должен уважать членство в группах AD.

person Thriggle    schedule 16.10.2015
comment
Спасибо, Thriggle, я решил проблемы с REST api. - person Ajay Nikam; 09.11.2015
comment
Прохладный! Сможете ли вы опубликовать свое решение в качестве ответа? Это может помочь другим. - person Thriggle; 09.11.2015
comment
Спасибо за решение. Есть ли способ загрузить все группы вместо одной? Мне нужно получить все группы, в которых находится пользователь. Мое текущее решение - перебрать все группы сайтов и выполнить запрос для получения свойства CanCurrentUserViewMembership, но это влияет на производительность. - person Trike; 28.06.2016
comment
@Trike Я расширил свой ответ другим примером кода, но вы правы, загрузка информации по всем группам сайтов занимает немного больше времени, чем загрузка конкретной. - person Thriggle; 28.06.2016
comment
@AjayNikam Я тоже столкнулся с аналогичной проблемой. не могли бы вы поделиться своим решением api для отдыха? - person Harsh Jaswal; 21.05.2019