适用环境:独立的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中的安全服务时也不再弹出登录框。