使用JavaScript客户端对象模型检查当前用户是否属于SP组

12

我还没有找到如何获取当前用户并检查它是否属于特定SharePoint组的具体示例,因为我没有找到任何东西,所以无法提供代码。

欢迎提供正确方向的帮助。

3个回答

19

SharePoint 2013 CSOM

前提条件: 仅兼容SharePoint 2013 CSOM API, 因为在SharePoint 2010中没有SP.GroupCollection.getByName Method

如何通过CSOM(JavaScript)检查当前用户是否属于SharePoint组:

function IsCurrentUserMemberOfGroup(groupName, OnComplete) {

        var currentContext = new SP.ClientContext.get_current();
        var currentWeb = currentContext.get_web();

        var currentUser = currentContext.get_web().get_currentUser();
        currentContext.load(currentUser);

        var allGroups = currentWeb.get_siteGroups();
        currentContext.load(allGroups);

        var group = allGroups.getByName(groupName);
        currentContext.load(group);

        var groupUsers = group.get_users();
        currentContext.load(groupUsers);

        currentContext.executeQueryAsync(OnSuccess,OnFailure);

        function OnSuccess(sender, args) {
            var userInGroup = false;
            var groupUserEnumerator = groupUsers.getEnumerator();
            while (groupUserEnumerator.moveNext()) {
                var groupUser = groupUserEnumerator.get_current();
                if (groupUser.get_id() == currentUser.get_id()) {
                    userInGroup = true;
                    break;
                }
            }  
            OnComplete(userInGroup);
        }

        function OnFailure(sender, args) {
            OnComplete(false);
        }    
}

使用方法

IsCurrentUserMemberOfGroup("Approvers", function (isCurrentUserInGroup) {
   if(isCurrentUserInGroup)
   {
      //...
   }
});
SharePoint 2010/2013 CSOM
function isUserMemberOfGroup(userId, groupId, success,error) {

     var ctx = SP.ClientContext.get_current(); 
     var allGroups = ctx.get_web().get_siteGroups();
     var group = allGroups.getById(groupId);
     ctx.load(group,'Users');

     ctx.executeQueryAsync(
        function(sender, args) {
            var userInGroup = findUserById(group.get_users(),userId);
            success(userInGroup);
       },
       error);    

       var findUserById = function(users,id){
           var found = false;
           var e =  group.get_users().getEnumerator();
           while (e.moveNext()) {
                var user = e.get_current();
                if (user.get_id() == id) {
                    found = true;
                    break;
                }
           } 
           return found; 
       };
}

使用方法

var currentUserId = _spPageContextInfo.userId;
var groupId = 4;
isUserMemberOfGroup(currentUserId, groupId, 
      function (isCurrentUserInGroup) {
          if(isCurrentUserInGroup)
              console.log('Current user is a member of Owners group'); 
          else
              console.log('Current user is not a member of Owners group'); 
      },
      function(sender,args){
         console.log(args.get_message());
      });

这只适用于用户直接是SharePoint组的成员,对吗?如果用户是AD组的成员,而该组又是SP组的成员,那怎么办?这是否可以通过JavaScript实现? - Hinek
没错。不幸的是,使用这种方法似乎无法确定用户是否是AD组的成员。 - Vadim Gremyachev
第一种只有一个executequery的方法在SP2013中不起作用,“集合尚未初始化。它尚未被请求或请求尚未执行。可能需要明确请求。”您能详细说明第一种方法吗?因为它似乎对我不起作用。需要特别注意什么吗? - Unnie
1
当我尝试加载带有“用户”的组时,我遇到了访问被拒绝的问题。用户是否需要具有模拟步骤(不可用)来检查组中的用户?由于这是JSCOM,我无法进行模拟,可能最终不得不在服务器端编写代码。 - 123 456 789 0

6
这里有一个在SharePoint 2013中更快的方法:
function CheckCurrentUserMembership() {

    var clientContext = new SP.ClientContext.get_current();
    this.currentUser = clientContext.get_web().get_currentUser();
    clientContext.load(this.currentUser);

    this.userGroups = this.currentUser.get_groups();
    clientContext.load(this.userGroups);
    clientContext.executeQueryAsync(OnQuerySucceeded);
}

function OnQuerySucceeded() {
         var isMember = false;
         var groupsEnumerator = this.userGroups.getEnumerator();
          while (groupsEnumerator.moveNext()) {
             var group= groupsEnumerator.get_current();               
             if(group.get_title() == "Administrator Group") {
                 isMember = true;
                 break;
             }
          }

          OnResult(isMember);
}

function OnQueryFailed() {
          OnResult(false);
}

使用此代码,我在 this.userGroups.getEnumerator(); 上收到错误信息 “无法读取未定义的属性'getEnumerator'” - GotaloveCode
在SharePoint Foundation 2013中,我遇到了相同的错误,有人找到解决方案了吗? - George M Ceaser Jr
在SP2013企业版中出现“无法读取未定义的'getEnumerator'属性”的错误。 - mzonerz

2
如果有人感兴趣,这种方法可以用于检查用户是否是使用组名的成员。
    var currentUserIsMemberOf = function(groupName){
      var found = false;
      var dfd = $.Deferred(function(){
         SP.SOD.executeOrDelayUntilScriptLoaded(function(){
            context = new SP.ClientContext.get_current();
            allGroups = context.get_web().get_siteGroups();
            context.load(allGroups);
            context.load(allGroups, 'Include(Users)');

            context.executeQueryAsync(
               function(){
                  var groupsEnumerator = allGroups.getEnumerator();
                  while (groupsEnumerator.moveNext()) {
                      var group = groupsEnumerator.get_current();               
                      if(group.get_title() == groupName) {
                          var usersEnumerator = group.get_users().getEnumerator();
                          while (usersEnumerator.moveNext()) {
                             var user = usersEnumerator.get_current();   
                             if(user.get_id() == _spPageContextInfo.userId) {
                                found = true;
                                break;
                             }
                          }
                      }
                   }
                  dfd.resolve(found);
               },
               function(){
                  dfd.reject(args.get_message());
               }
            );
         }, 'sp.js');
      });
      return dfd.promise();
   }

您可以像这样使用

currentUserIsMemberOf("Members of Demo").done(function(result){ 
                                                  alert(result) 
                                                });

请注意,此代码使用Promise,您可以参考jQuery使用自己的自定义Deferred对象或删除Deferred对象。

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