基于token的ArcGIS Server地图服务安全访问策略

2,406 阅读4分钟

一、前言

最近在工作中,经常会遇到关于地图服务访问的安全性问题,对于这个问题,我翻阅了很多资料,网上给出的方案大多都是做代理。根据官网给出的指导,在多次尝试之后,并未有满意的结果。最后在与同事的反复讨论之后,确定并实现了解决方案的技术路线 —— 基于用户权限的 ArcGIS 10.2 for Server Rest服务安全性管理

二、基于用户权限的 ArcGIS 10.2 for Server Rest服务安全性管理

ArcGIS Server 安全性确定了管理 GIS 服务器、发布到 GIS 服务器以及使用服务的用户。

1. 创建用户

用户是指访问 ArcGIS Server 资源的任何人员或者软件代理商。

2. 设置地图服务的访问权限

地图服务的安全设置为私有,仅面向用户开放访问权限。

3. 地图服务访问测试

打开设置好的地图服务地址进行访问:https://<host>:<port>/<site>/MapServer,此时,就需要输入用户的账号和密码才能进行访问,这样就达到目的了。

三、基于token的地图服务地址访问认证处理

1. 获取地图服务地址访问的token

这里可以使用ArcGIS REST API提供的接口来获取token:

http://<host>:<port>/<site>/generateToken接口的详细信息可以参考:developers.arcgis.com/rest/servic…

(1) 客户端获取token

浏览器上打开http://<host>:<port>/<site>/generateToken,输入已经配置好的参数值,即可获取地图服务地址访问的token

(2) 前端获取token的代码

/**
 * @description:获取地图服务访问的token
 * @params: url{String} 请求token的地址, 格式如:http://<host>:<port>/<site>/generateToken
 */
function getArcgisToken(url) {
    var params = {
        username: userName, // userName: 用户名
        password: password, // password: 用户密码
        client: 'requestip', // 客户端标识类型
        referrer: '', // 参照方式
        ip: '',
        expiration: 60 * 24 * 10, // 单位:分钟,可以不设置,不设置时默认最大
        f: 'json'
    };
    $.ajax({
        type: "get",
        url: url,
        data: params,
        dataType: "json",
        success: function (data) {
            if (data.success) {
                var arcgisToken = data.data.Token; // 地图服务地址访问的令牌
                ...
            }
        },
        error: function (error) {
            console.log(error);
         }
    });
}

(3) 后端获取token的代码

public class ArcgisServerToken {
    @Value("${arcgis.server.url}")
    private String url; // 请求token的地址
    @Value("${arcgis.server.username}")
    private String username; // 用户名
    @Value("${arcgis.server.password}")
    private String password; // 用户密码
    @Value("${arcgis.server.client}")
    private String client; // 客户端标识类型
    @RequestMapping
    public AjaxResult getToken() throws IOException {
        HttpRequester request = new HttpRequester();
        Map param = new HashMap();
        param.put("username", username); 
        param.put("password", password); 
        param.put("client", client); 
        param.put("referer", "");
        param.put("ip", "");
        param.put("f", "json");
		// param.put("expiration", 60*24*10); // 单位:分钟,可以不设置,不设置时默认最大
        HttpRespons respons = (HttpRespons) request.sendPost(url, param);
        String json = respons.getContent();
        JSONObject jsonObject = JSONObject.fromObject(json);
        String token = jsonObject.getString("Token");
        return new AjaxResult(token);
    }
}

2. 基于token的地图服务地址的安全访问

通过上述的方式,无论拼接的是后端还是前端返回的token,均已实现对地图服务地址的安全访问策略。

http://<host>:<port>/<site>/MapServer?token=LM1zdTdqq8heIbGGJk9Iao7h5WIZskdFRpQFARe-UzVOeT_rEJjTR3Nk47VWB1Fu

四、总结

  • 遇到这样的问题,首先查找是否有相关的工作场景的技术方案及实现思路;有技术方案时,通过分析评估看需要怎么样的实现以及可能遇到的问题。

  • 本文的技术实现路线概括为:

    1. 地图服务管理器(ArcGIS Manager)创建拥有访问权限的用户;
    2. 配置对应地图服务的访问权限
    3. 可以通过客户端前端后台获取地图服务访问的token;
    4. 浏览器访问拼接token后的地图服务
  • 做事要趁早,多尝试。早前看到这个问题,查找资料大都是通过代理解决,所以就想着以后可以通过后台搭建代理框架。其实就应该多尝试,毕竟实践是检验真理的唯一标准

五、参考文章

博主 技术小胖子 的文章:ArcGIS 10.1 for Server Rest服务安全性管理:基于用户和角色权限

博主 羊子雄起 的文章:ArcGIS for JavaScript获取token

六、最后

好了,本文的思路分享就写到这里了。

2021年了,过去一年疫情,属实不易。

新的一年,祝大家 “牛” 转乾坤; 新的一年,如果有什么新的工作发现,我也会坚持分享(佛系创作哈哈哈哈~)。

今年的第一篇文章,欢迎❤️点赞+收藏+转发❤️,谢谢大家🙏

如果工作中你也遇到这样的问题,赶快动手试试吧!

如果有什么疑问或建议,欢迎留言交流。若文中有不正之处,欢迎大家留言指正,不吝赐教