【问题标题】:Check if Current Users belongs to SP group using javascript Client Side Object Model使用javascript客户端对象模型检查当前用户是否属于SP组
【发布时间】:2014-04-03 01:08:37
【问题描述】:

我还没有找到如何获取当前用户然后检查它是否属于特定共享点组的具体示例,因为我没有找到任何我无法提供代码的内容,

感谢您对正确方向的帮助。

【问题讨论】:

    标签: sharepoint sharepoint-2010 sharepoint-2013 csom


    【解决方案1】:

    SharePoint 2013 CSOM

    先决条件:仅与 SharePoint 2013 CSOM API 兼容 SP.GroupCollection.getByName Method 不可用 SharePoint 2010

    如何通过 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 实现吗?
    • 没错。不幸的是,使用这种方法似乎无法确定用户是否是 AD 组的成员
    • 只有一个executequery的第一种方法不适用于SP2013,“集合尚未初始化。尚未请求或尚未执行请求。可能需要显式请求。 ”。您能否详细说明第一种方法,因为它似乎对我不起作用。有什么具体要做的吗?
    • 我在尝试使用 Users 加载组时被拒绝访问。用户是否需要有一个模拟步骤(不可用)来检查组中的用户?由于这是 JSCOM,我无法进行模拟,可能最终不得不在服务器端代码中编写它。
    【解决方案2】:

    以下是使用 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);
    }
    

    【讨论】:

    • 这样我得到错误 'Cannot read property 'getEnumerator' of undefined' on this.userGroups.getEnumerator();
    • 在 SharePoint Foundation 2013 中,我遇到了同样的错误,有人找到解决方案了吗?
    • IN SP2013 Enterprice "无法读取未定义的属性 'getEnumerator'"
    【解决方案3】:

    如果有人感兴趣。当您要使用组名检查用户是否是组的成员时,可以使用此方法。

        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对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-22
      • 2021-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-27
      • 2017-07-23
      相关资源
      最近更新 更多