ArcGIS api for javascript 3.x通过''url?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安全服务,类似这样请求信息:http://***/arcgis/rest/services/test/wd/MapServer?token= ***
       在前端web应用程序中,我们要如何使用受保护的server服务呢? 当已经获得了使用权限的用户和密码,又怎么样给这个服务授权?再登录之后,如何看到该用户权限的服务资源?这些都需要获得token,再使用这个token初始化地图。

注意!!!:在ArcGIS api for javascript 3.x中可以通过’‘url?token=’‘动态拼接的方式访问受保护的server服务,但是在ArcGIS api for javascript 4.x中推荐使用IdentityManager.registerToken()注册token的方式,官方帮助文档有明确的说明。当然api 3.x也是可以用这种IdentityManager注册token方式,具体见小编下一篇文章的介绍。
       经过测试发现对于api 4系列,在api 4.6版本前虽然也是可以通过’‘服务url?token=’'这种方式访问server安全服务,但是4.6开始的版本不能用这种方式,查看控制台会出现 [esri.layers.mixins.ArcGISService] removeQueryParameters() Url query parameters are not supported, the following parameters have been removed: token. 这样的提示,另外查看API中的各layers类有一个token属性,如mapImageLayer的token属性( MapImageLayer({
url: Url, token:"" }) ),但是在高版本中已经弃用Deprecated,所以在API 4.x推荐直接用IdentityManager.registerToken注册token的方式。
在这里插入图片描述

具体步骤:

1、首先我们先为server新建用户和角色
在这里插入图片描述
在这里插入图片描述
2、为服务设置权限,arcgis server的权限是赋予角色对资源的访问能力,我们可以对server服务权限设置,也可以对服务所在文件夹设置权限。若对文件夹设置权限,则文件夹中的服务自动继承权限;若对文件夹里的服务设置安全权限,那么会覆盖从文件夹中继承的权限。
进入server manager页面,选择需要要隐藏的服务(或服务所在文件夹)设置其权限为私有,并且赋予刚创建的角色以具有访问权限。
在这里插入图片描述
在这里插入图片描述
     此时,如果在前端直接调用刚才设置权限的地图服务,页面会出现登录框。登录刚才的用户和密码即可查看,但是这样每次刷新都需要登录,影响使用。

3、接下来用刚才创建的账户去生成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
在这里插入图片描述
参数说明
(1)username: 使用该token的用户的用户名(刚创建的用户test1)
(2) password:用户密码
(3) Client:使用token的客户端,提供三种类型:
          a、HTTP Referer:Web应用的URL,申请的token可由该应用的页面使用;
          b、IP:申请的token只能供指定IP地址的请求中使用;
          c、 IP Requested:只能由发出请求机器的ip使用该token;
(4) HTTP referer:如果Client选择了HTTP referer,那么这里就需要输入应用程序的地址;
(5) IP:如果Client选择了IP,这里就需要输入IP地址;
(6) Expiration:过期时间 ,超过该时间token将失效。默认不填有效时间为60分钟
注意
       a、arcgis server有短期令牌和长期令牌,长期token需要要绑定ip或者referer,这样就算token被盗用了,从另外一台不同ip的机器发出相同用户名和密码的请求也会被拒绝;对于referer,除非绑定的http hearder发过来的请求,否则token也会被拒绝。 短期的token可以不用绑定ip或者referer,因为token很快就会过期。
       b、如果client选择IP或RequestIP,那么可以在此IP对应的机器上通过带token的URL进行Export Map;
       c、如果选择HTTP Referer,那么生成的token只能在应用程序中使用, 需要注意的是利用HTTP Referer的client的方式生成的token,直接在浏览器中输入"地图服务url?token="是不能查看的,这个token只能用于程序中。

通过ajax发送请求获取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请求的令牌获取。

4、如何在程序中带token调用地图服务资源?直接给出完整的代码

示例代码:

<!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="../jquery-1.11.1.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"
            "dojo/domReady!"
        ], function (Map, ArcGISDynamicMapServiceLayer) {

            var map = new Map("map");
            var username = "test1";
            var password = "53569";
            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" //dataType不能少
            });
            if (tokenvalue) {
                tokenvalue
                    .success(function (response){
                        if (response.token) {
                            //成功生成token
                            console.log(response.token);
                            var layerUrl = "https://192.168.16.105:6443/arcgis/rest/services/test/testpoint/MapServer?token="+response.token;
                            var layer = new ArcGISDynamicMapServiceLayer(layerUrl);
                            map.addLayer(layer);
                        }
                    }).error(function(err) {
                    console.log("操作失败。err:" + err);
                });
            }

        });
    </script>
</head>

<body>
<div id="map"></div>
</body>
</html>

在这里插入图片描述
总结:
       本篇介绍了ArcGIS api for javascript 3.x中通过’‘url?token=’'动态拼接的方式访问受保护的server服务,那么接下来再介绍另外两种方法:即通过代理来实现server服务权限的控制和arcgis api for javascript 3.x 和4.x 通过IdentityManager注册token的方式来访问受保护的server服务。

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

猜你喜欢

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