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

适用环境:独立的server环境,没有和portal进行联合。enterprise环境访问安全服务见另外两篇文章
https://blog.csdn.net/qq_40376439/article/details/104227280
https://blog.csdn.net/qq_40376439/article/details/104217511
使用场景:当我们发布的arcgis server服务设置为公开或者发布到外网时,这样所有人都可以访问,如果我们只想对部分人进行开放并且限定时间的使用,而不希望其他人员访问我们的服务。那就需要对该服务设置权限对服务的请求进行验证,这样服务就无法被所有人访问,将服务设置为私有,给使用者创建用户和分配角色并生成token,相当于先进行验证,验证成功再响应服务请求。
上一篇文章介绍了:在ArcGIS api for javascript 3.x中通过’‘url?token=’'动态拼接的方式来访问访问server安全服务。
本篇来介绍下在ArcGIS api for javascript 3.x和4.x中使用IdentityManager注册token的方式来访问受保护的server服务。
下一篇介绍 通过代理的方式动态获取token访问server的安全服务

具体步骤:

1、首先我们先为server新建用户和角色
在这里插入图片描述
在这里插入图片描述
2、为服务设置权限,arcgis server的权限是赋予角色对资源的访问能力,我们可以对server服务权限设置,也可以对服务所在文件夹设置权限。若对文件夹设置权限,则文件夹中的服务自动继承权限;若对文件夹里的服务设置安全权限,那么会覆盖从文件夹中继承的权限。
进入server manager页面,选择需要要隐藏的服务(或服务所在文件夹)设置其权限为私有,并且赋予刚创建的角色以具有访问权限。
在这里插入图片描述
在这里插入图片描述
      在ArcGIS api for javascript通过IdentityManager注册token的方式访问独立server的安全服务也总结了两种方法,本篇将依次展开介绍:

方法一:

1、用刚才创建的账户去生成token ,
token可由https://gisserver.domain.com:6443/arcgis/tokens
或https://gisserver.domain.com:6443/arcgis/admin/generateToken这样格式的地址来获取,关于生成Token的说明详见
https://developers.arcgis.com/rest/services-reference/generate-token.htm
生成token的参数这里不做介绍了上篇文章有说明。
在这里插入图片描述
通过ajax发送post请求获取token:

 $.ajax({
                type: "POST",
                url: "http://192.168.16.105:6080/arcgis/tokens/generateToken",
                data: {
                    username: "test1",
                    password:"54342",
                    client: "requestip",
                    expiration: '60',
                    f: "json"
                },
                dataType: "json",
                success:function(res){
                   console.log(res.token);
               }
            });

注意
       server10.3.1 和更高版本,仅允许通过http post请求获取 ArcGIS 令牌,在默认情况下不可用 http get获取token,server10.3.1 开始如果用这种get请求方式获取token就会报错如 http://xxx/arcgis/tokens/generateToken?password=***&f=html&username=***&client=***&referer=&ip=&expiration=*** ,可以登录server后台,进行设置启用基于http get请求,见https://enterprise.arcgis.com/zh-cn/server/latest/administer/windows/enable-token-acquisition-through-an-http-get-request.htm ,但是不推荐启用get请求,因为get请求可能会将用户名和密码遗留在浏览器历史记录中,使用post会更安全。在 server10.2.2 和较早版本中,默认启用基于http get请求的令牌获取。

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

 IdentityManager.registerToken({
   server: "https://192.168.16.105:6443/arcgis/rest/services",
   token: response.token
 });

完整示例代码:

arcgis api for javascript 4系列 :(arcgis api for javascript 3系列的代码和4系列基本一致这里不再列出)

<!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 = "test1";
            var password = "54342";
            var tokenvalue = $.ajax({
                type: "POST",
                url: "https://192.168.16.105:6443/arcgis/tokens/generateToken",
                data: {
                    username: username,
                    password: password,
                    client: "requestip",
                    expiration: '60',
                    f: "json"
                },
                dataType: "json" 
            });
            if (tokenvalue) {
                tokenvalue
                    .success(function (response){
                        if (response.token) {
                            //成功生成token
                            IdentityManager.registerToken({
                                server: "https://192.168.16.105:6443/arcgis/rest/services",
                                token: response.token
                            });
                            console.log(response.token);
                            var layerUrl = "https://192.168.16.105:6443/arcgis/rest/services/test/testpoint/MapServer";
                            var layer = new MapImageLayer({
                                url: layerUrl
                            });
                            map.add(layer);
                        }
                    }).error(function(err) {
                    console.log("操作失败 err:" + err);
                });
            }
        });
    </script>
</head>
<body>
<div id="viewDiv"></div>
</body>
</html>

方法二:

      也可以直接使用IdentityManager.generateToken(serverInfo, userInfo, options)方法生成token,其中需要用到ServerInfo类,ServerInfo类的介绍见https://developers.arcgis.com/javascript/latest/api-reference/esri-identity-ServerInfo.html ,再利用IdentityManager.registerToken(properties)方法将访问token令牌进行注册。下面直接上完整的代码供大家参考(本次给出arcgis api for javascript 3系列的示例代码 ,4系列的代码和3系列基本一致这里不再列出)。

 <!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>test</title>
    <style>
        html,
        body,
        #map {
            padding: 0;
            margin: 0;
            height: 100%;
            width: 100%;
        }
    </style>
    <link rel="stylesheet" href="https://js.arcgis.com/3.31/esri/css/esri.css">
    <script src="jquery-1.11.1.min.js"></script>
    <script src="https://js.arcgis.com/3.31/"></script>
    <script>
        require(["esri/config",
            "esri/map",
            "esri/layers/ArcGISDynamicMapServiceLayer", "esri/ServerInfo","esri/IdentityManager",
            "dojo/domReady!"
        ], function(esriConfig,
                    Map,
                    ArcGISDynamicMapServiceLayer,ServerInfo,IdentityManager
        ) {
            esriConfig.defaults.io.corsEnabledServers.push("https://192.168.16.105:6443");
               var map = new Map("map");
            //生成token start
            var serverInfo = new ServerInfo();
            serverInfo.server = "https://192.168.16.105:6443/arcgis/rest/services/";
            serverInfo.tokenServiceUrl = "https://192.168.16.105:6443/arcgis/tokens/generateToken";
            var userInfo  = {username:"test1",password:"WL3696569"}; 
            IdentityManager.generateToken(serverInfo,userInfo).then(function(data){
                var tokenValue = data.token;
                IdentityManager.registerToken({
                    server:"https://192.168.16.105:6443/arcgis/rest/services/",
                    token:tokenValue
                });
                var layerUrl = "https://192.168.16.105:6443/arcgis/rest/services/test/testpoint/MapServer";
                var layer = new ArcGISDynamicMapServiceLayer(layerUrl);
                map.addLayer(layer);
            },function(error){
                console.error(error);
            });

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

在这里插入图片描述
此时当我们调用server中的安全服务时也不再弹出登录框。

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

猜你喜欢

转载自blog.csdn.net/qq_40376439/article/details/104260652
今日推荐