适用环境:独立的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服务。