【问题标题】:How to check if user belongs to a sharepoint AD group or not using REST/Javascript only?如何检查用户是否属于共享点 AD 组或仅使用 REST/Javascript?
【发布时间】:2017-09-25 01:26:42
【问题描述】:

如何检查当前用户是否属于共享点 AD 组或仅使用 REST/Javascript?

【问题讨论】:

标签: javascript jquery rest sharepoint


【解决方案1】:

目前我通过在 SP 组中添加我的安全组然后检查下面代码中提到的属性来实现它。但唯一的问题是,我有大量网站集,所以我必须在任何地方创建一个 SP 组,然后在其中添加我的安全组。

var clientContext = new SP.ClientContext();
var groupId = ...;  // my group Id
var group = clientContext.get_web().get_siteGroups().getById(groupId);
clientContext.load(group,"CanCurrentUserViewMembership");
clientContext.load(group,"CanCurrentUserManageGroup");
clientContext.executeQueryAsync(
function(sender,args){
    if(group.get_canCurrentUserViewMembership() == true)
        {
            if(group.get_canCurrentUserManageGroup() == false) // this check for group owners 
            {     //access denied logic
            }           
        }     
    },
    function(sender,args){   //failed   });

【讨论】:

  • 如果要检查具体用户而不是当前用户怎么办?
【解决方案2】:

这可以通过下面的函数来实现

备注:它只适用于“当前用户”,但很多时候就足够了。

我添加了 Jquery 承诺创建,因此需要 Jquery,这是为了使该功能在 IE11 中工作)

function _isCurrentUserInGroup(groupId) {
    var promise = $.Deferred(function () {
        var endpoint;
        endpoint = _spPageContextInfo.webAbsoluteUrl + "/_api/web/sitegroups(" + groupId + ")/CanCurrentUserViewMembership"
        jQuery.ajax({
            "url": endpoint,
            "type": "GET",
            "contentType": "application/json;odata=verbose",
            "headers": {
                "Accept": "application/json;odata=verbose"
            }
        }).then(function (result) {
            promise.resolve(result.d.CanCurrentUserViewMembership);
        }, function (sender, args) {
            console.log(args.get_message());
            soc_appinsights.appInsights.trackException(args.get_message());
            promise.reject(sender, args);
        });
    });
    return promise;
}

可以这样调用:

_isCurrentUserInGroup(20).then(function(result) 
{ console.log(result); //true or false. } ,
function (sender, args) { console.log(args.get_message(););

您需要知道组的 id,但这很容易被检索到。

【讨论】:

    【解决方案3】:

    你可以通过使用这样的函数来做到这一点:

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

    用法:

    function CheckUserGroup()
    {
    IsCurrentUserMemberOfGroup("YourGroupName", function (isCurrentUserInGroup) {
        if(isCurrentUserInGroup)
        {
            //Do something
        }
        else
        {
            //Do something else
        }
    });
    }
    

    【讨论】:

    • 我假设您指的是 SharePoint 组,因为据我所知,没有任何东西称为 SharePoint AD 组。 AD 组与 SharePoint 没有任何关系,这些组可以像添加任何常规用户一样从 SP 组中添加/删除。
    • 不,它不是 SharePoint 组,通过广告组,我的意思是安全组。就我而言,“除外部用户外的所有人”都可以访问。现在根据客户的要求,大约有 100 个用户,他们想要限制访问。为此,创建了一个具有这 100 个用户的安全组。所以。我想检查登录用户是否属于该安全组。
    【解决方案4】:

    您可以尝试使用 REST 编码的这种方法。

    <script src="https://code.jquery.com/jquery-1.11.2.min.js" type="text/javascript" ></script>
    
    <script type="text/javascript">
    $(function(){
        isMember("Test Group");
    });
    
    function isMember(groupName){
        $.ajax({
            url: _spPageContextInfo.webAbsoluteUrl + "/_api/web/sitegroups/getByName('"+ groupName +"')/Users?$filter=Id eq " + _spPageContextInfo.userId,
            method: "GET",
            headers: { "Accept": "application/json; odata=verbose" },
            success: function(data){
                if(data.d.results[0] != undefined){
                    // Exist in group
                }
                else
                {
                    // Does not exist
                }
            }
        });
    }
    </script>
    

    【讨论】:

    • 谢谢,但上面的代码适用于 SP 组,不适用于 AD(Security) 组。
    • Rooney123 如果要检查用户是否属于 AD,则 Web 对象 web.ensureuser() 上有方法,如果在 Active Directory 中找不到具有指定 logonName 的用户,则会引发异常。唯一的方法是检查指定的登录名是否属于网站的有效用户,如果登录名不存在,则将其添加到网站。 Ref : msdn.microsoft.com/en-us/library/… 尝试为此查找 REST API。
    • 是的,从服务器端我可以做到,但我在 SP 在线,服务器端编码根据客户端限制是不允许的。否则我 cud 做了一项服务并使用 JS 调用它。
    猜你喜欢
    • 2012-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2018-07-26
    相关资源
    最近更新 更多