当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中的私有服务时不再弹出登录框。