ArcGIS api for javascript通过IdentityManager注册token的方式访问enterprise的安全服务

      当ArcGIS enterprise中的服务没有设置共享属性或未公开时,前端在访问该服务的时候就会出现输入用户名和密码的弹框,并且每次刷新网页的时候,都需要手动登录一次Portal,但是对于多数用户来说觉着这样很不方便,那如何才能不显示这个登录框呢?下面将介绍一种方法即通过token的方式访问enterprise的私有服务来实现。另一种方法是使用代理具体见下一篇文章的介绍https://blog.csdn.net/qq_40376439/article/details/104217511:本篇所介绍的方法适用场景是arcgis server和portal进行了联合,server由portal进行托管,server服务的权限、访问是通过portal来进行管理)
在这里插入图片描述

具体步骤:
      ArcGIS api for javascript通过token的方式访问enterprise安全服务的方式也总结了两种,本篇将依次展开介绍:

方法一:
1、当server和portal进行了联合托管,那么server服务的权限、访问是通过portal来进行管理,所以就需要用到portal获取token的地址:https://域名/portal/sharing/rest/generateToken,见下图:
在这里插入图片描述
那么首先需要先发送请求获取token:通过ajax发送post请求

 var tokenDeferred = $.ajax({
                type: "POST",
                url: portalUrl + "sharing/generateToken",
                data: {
                    username: portal账户,
                    password: 密码,
                    referer: location.hostname,
                    expiration: 60,
                    f: "json"
                },
                dataType: "json"
            });

2、在ArcGIS api for javascript 中,认证信息的管理维护在IdentityManager接口,即“esri/identity/IdentityManager”,https://developers.arcgis.com/javascript/latest/api-reference/esri-identity-IdentityManager.html,利用IdentityManager.registerToken(properties)方法将访问令牌注册。https://developers.arcgis.com/javascript/latest/api-reference/esri-identity-IdentityManager.html#registerToken

 IdentityManager.registerToken({
   server: "https://wl.arcgisonline.cn/portal/sharing/rest",
   token: response.token
 });

完整示例代码:

arcgis api for javascript 4.x :

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>test</title>
    <style>
        html,
        body,
        #viewDiv {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
        }
    </style>
    <link rel="stylesheet" href="https://js.arcgis.com/4.14/esri/css/main.css"/>
    <script src="https://js.arcgis.com/4.14/init.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.min.js"></script>
    <script>
        require([
            "esri/Map",
            "esri/views/MapView",
            "esri/layers/MapImageLayer",
            "esri/identity/IdentityManager",
            "dojo/domReady!"
        ], function(
            Map,
            MapView,
            MapImageLayer,
            IdentityManager
        ) {

            var map = new Map({
                basemap: "osm"
            });
            var view = new MapView({
                container: "viewDiv",
                map: map,
                zoom: 13,
                center: [116.38, 39.9]
            });
            //生成token start
            var username = "portaladmin";
            var password = "WL3696569";
            var portalUrl = "https://wl.arcgisonline.cn/portal";
            var tokenvalue = $.ajax({
                type: "POST",
                url: portalUrl + "/sharing/generateToken",
                data: {
                    username: username,
                    password: password,
                    referer: location.hostname, // URL of the sending app.
                    expiration: 60,
                    f: "json"
                },
                dataType: "json" //dataType不能少
            });
            if (tokenvalue) {
                tokenvalue.success(function (response){
                        if (response.token) {
                            //成功生成token
                           IdentityManager.registerToken({
                                server: "https://wl.arcgisonline.cn/portal/sharing/rest",
                                token: response.token
                            });

                            var layerUrl = "https://wl.arcgisonline.cn/server/rest/services//wl/time1/MapServer";
                            var layer = new MapImageLayer({
                                url: layerUrl
                            });
                            map.add(layer);
                        }
                    }).error(function(err) {
                        console.log("操作失败。err:" + err);
                    });
            }
            //生成token end

        });
    </script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>

arcgis api for javascript 3.x代码,基本和4.x一致:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta name="viewport" content="initial-scale=1, maximum-scale=1,user-scalable=no" />
    <title>test</title>
    <link rel="stylesheet" href="https://js.arcgis.com/3.31/esri/css/esri.css">
    <script src="https://cdn.staticfile.org/jquery/1.11.1/jquery.min.js"></script>
    <style>
        html,
        body,
        #map {
            height: 100%;
            width: 100%;
            margin: 0;
            padding: 0;
        }
    </style>
    <script src="https://js.arcgis.com/3.31/"></script>
    <script>
        require([
            "esri/map",
            "esri/layers/ArcGISDynamicMapServiceLayer", "esri/IdentityManager",
            "dojo/domReady!"
        ], function (Map, ArcGISDynamicMapServiceLayer, IdentityManager) {

            var map = new Map("map");
            var username = "wl";
            var password = "445576";
            var portalUrl = "https://wl.esrichina.com/portal/";
            var tokenDeferred = $.ajax({
                type: "POST",
                url: portalUrl + "sharing/generateToken",
                data: {
                    username: username,
                    password: password,
                    referer: location.hostname,
                    expiration: 60,
                    f: "json"
                },
                dataType: "json"
            });
            if (tokenDeferred) {
                tokenDeferred.success(function (response) {
                    if (response.token) {
                        IdentityManager.registerToken({
                            server: "https://wl.arcgisonline.cn/portal/sharing/rest",
                            token: response.token
                        });
                        var layer = new ArcGISDynamicMapServiceLayer("https://wl.arcgisonline.cn/server/rest/services//wl/time1/MapServer");
                        map.addLayer(layer);
                    }
                }).error(function (error) {
                        console.log("操作失败.error:" + error);
                    })
            }

        });
    </script>
</head>
<body>
<div id="map"></div>
</body>
</html>

方法二:
      可以直接使用IdentityManager的generateToken(serverInfo, userInfo, options)方法生成token,再利用IdentityManager.registerToken(properties)方法将访问token令牌进行注册。下面直接上完整的代码供大家参考。

 <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no">
    <title></title>
    <link rel="stylesheet" href="http://js.arcgis.com/4.14/esri/css/main.css">
    <script src="http://js.arcgis.com/4.14/"></script>
    <style>
        html,
        body,
        #viewDiv {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
        }
    </style>
    <script>
        require([
            "esri/Map",
            "esri/views/MapView",
            "esri/layers/MapImageLayer",
            "esri/identity/IdentityManager",
            "esri/identity/ServerInfo",
            "dojo/domReady!"
        ], function(
            Map, MapView,MapImageLayer,IdentityManager,ServerInfo
        ) {
           var map = new Map({
               basemap:"osm"
           });
           var view = new MapView({
                center: [110, 35],
                container: "viewDiv",
                map: map,
                zoom: 3
            });
            //获取Token
            var serverInfo = new ServerInfo();
            serverInfo.server = "https://wl.arcgisonline.cn/server/rest/services";
            serverInfo.tokenServiceUrl = "https://wl.arcgisonline.cn/portal/sharing/rest/generateToken";
            var userInfo  = {username:"portaladmin",password:"34ttr"};  //portal的用户和密码
            IdentityManager.generateToken(serverInfo,userInfo).then(function(data){
              var tokenValue = data.token;
                //注册Token,注册后portal的所有资源只要此用户有权限访问就可以直接使用,之前的所有安全服务请求都将会把token值作为参数发送到服务器端
                IdentityManager.registerToken({server:"https://wl.arcgisonline.cn/server/rest/services",token:tokenValue});
            },function(error){
                console.error(error);
            });
            var layer = new MapImageLayer({url: "https://wl.arcgisonline.cn/server/rest/services/wl/time1/MapServer"});
            map.add(layer);
        });
    </script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>

此时当我们调用portal中的私有服务时不再弹出登录框。

发布了8 篇原创文章 · 获赞 0 · 访问量 691

猜你喜欢

转载自blog.csdn.net/qq_40376439/article/details/104227280