UNPKG

openlayermap

Version:

openlayer Map Component for Vue 2.0

342 lines (318 loc) 10.5 kB
import {SuperMap} from '../SuperMap' import {Util} from '../commontypes/Util' import {FetchRequest} from '../util/FetchRequest' /** * @name SecurityManager * @memberOf SuperMap * @namespace * @category Security * @description 安全管理中心,提供iServer,iPortal,Online统一权限认证管理 * > 使用说明: * > 创建任何一个服务之前调用{@link SuperMap.SecurityManager.registerToken}或 * > {@link SuperMap.SecurityManager.registerKey}注册凭据。 * > 发送请求时根据url或者服务id获取相应的key或者token并自动添加到服务地址中 */ export class SecurityManager { /** * @description 从服务器获取一个token,在此之前要注册服务器信息 * @param url {string}-服务器域名+端口,如:http://localhost:8092 * @param tokenParam -{SuperMap.TokenServiceParameter} token申请参数 * @return {Promise} 返回包含token信息的Promise对象 */ static generateToken (url, tokenParam) { var serverInfo = this.servers[url] if (!serverInfo) { return } return FetchRequest.post(serverInfo.tokenServiceUrl, JSON.stringify(tokenParam.toJSON())).then(function (response) { return response.text() }) } /** * @description 注册安全服务器相关信息 * @param serverInfos -{SuperMap.ServerInfo} 服务器信息 */ static registerServers (serverInfos) { this.servers = this.servers || {} if (!Util.isArray(serverInfos)) { serverInfos = [serverInfos] } for (var i = 0; i < serverInfos.length; i++) { var serverInfo = serverInfos[i] this.servers[serverInfo.server] = serverInfo } } /** * @description 服务请求都会自动带上这个token * @param url {string} -服务器域名+端口:如http://localhost:8090 * @param token -{string} token */ static registerToken (url, token) { this.tokens = this.tokens || {} if (!url || !token) { return } var domain = this._getTokenStorageKey(url) this.tokens[domain] = token } /** * @description 注册key,ids为数组(存在一个key对应多个服务) * @param ids -{Array} 可以是服务id数组或者url地址数组或者webAPI类型数组 * @param key -{string} key */ static registerKey (ids, key) { this.keys = this.keys || {} if (!ids || ids.length < 1 || !key) { return } ids = (Util.isArray(ids)) ? ids : [ids] for (var i = 0; i < ids.length; i++) { var id = this._getUrlRestString(ids[0]) || ids[0] this.keys[id] = key } } /** * @description 获取服务器信息 * @param url {string}-服务器域名+端口,如:http://localhost:8092 * @returns {SuperMap.ServerInfo} 服务器信息 */ static getServerInfo (url) { this.servers = this.servers || {} return this.servers[url] } /** * @description 根据Url获取token * @param url -{string} 服务器域名+端口,如:http://localhost:8092 * @returns {string} token */ static getToken (url) { if (!url) { return } this.tokens = this.tokens || {} var domain = this._getTokenStorageKey(url) return this.tokens[domain] } /** * @description 根据Url获取key * @param id -{string} id * @returns {string} key */ static getKey (id) { this.keys = this.keys || {} var key = this._getUrlRestString(id) || id return this.keys[key] } /** * @description iServer登录验证 * @param url -{string} iServer首页地址,如:http://localhost:8090/iserver * @param username -{string} 用户名 * @param password -{string} 密码 * @param rememberme -{boolean} 是否记住 * @returns {Promise} 返回包含iServer登录请求结果的Promise对象 */ static loginiServer (url, username, password, rememberme) { var end = url.substr(url.length - 1, 1) url += end === '/' ? 'services/security/login.json' : '/services/security/login.json' var loginInfo = { username: username && username.toString(), password: password && password.toString(), rememberme: rememberme } loginInfo = JSON.stringify(loginInfo) var requestOptions = { headers: { 'Content-Type': 'application/x-www-form-urlencoded charset=UTF-8' } } return FetchRequest.post(url, loginInfo, requestOptions).then(function (response) { return response.json() }) } /** * @description iServer登出 * @param url -{string} iServer首页地址,如:http://localhost:8090/iserver * @returns {Promise} 是否登出成功 */ static logoutiServer (url) { var end = url.substr(url.length - 1, 1) url += end === '/' ? 'services/security/logout' : '/services/security/logout' var requestOptions = { headers: { 'Content-Type': 'application/x-www-form-urlencoded charset=UTF-8' }, withoutFormatSuffix: true } return FetchRequest.get(url, '', requestOptions).then(function () { return true }).catch(function () { return false }) } /** * @description Online登录验证 * @param callbackLocation -{string} 跳转位置 * @param newTab -{boolean}是否新窗口打开 */ static loginOnline (callbackLocation, newTab) { var loginUrl = SecurityManager.SSO + '/login?service=' + callbackLocation this._open(loginUrl, newTab) } /** * @description iPortal登录验证 * @param url -{string} iportal首页地址 * @param username -{string} 用户名 * @param password -{string} 密码 * @returns {Promise} 返回包含iPortal登录请求结果的Promise对象 */ static loginiPortal (url, username, password) { var end = url.substr(url.length - 1, 1) url += end === '/' ? 'web/login.json' : '/web/login.json' var loginInfo = { username: username && username.toString(), password: password && password.toString() } loginInfo = JSON.stringify(loginInfo) var requestOptions = { headers: { 'Content-Type': 'application/x-www-form-urlencoded charset=UTF-8' }, withCredentials: true } return FetchRequest.post(url, loginInfo, requestOptions).then(function (response) { return response.json() }) } /** * @description iPortal登出 * @param url -{string} iportal首页地址 * @returns {Promise} 如果登出成功,返回true否则返回false */ static logoutiPortal (url) { var end = url.substr(url.length - 1, 1) url += end === '/' ? 'services/security/logout' : '/services/security/logout' var requestOptions = { headers: { 'Content-Type': 'application/x-www-form-urlencoded charset=UTF-8' }, withCredentials: true, withoutFormatSuffix: true } return FetchRequest.get(url, '', requestOptions).then(function () { return true }).catch(function () { return false }) } /** * @description iManager登录验证 * @param url -{string} iManager地址。<br> * 地址参数为iManager首页地址,如: http://localhost:8390/imanager<br> * @param loginInfoParams -{Object} iManager 登录参数<br> * userName -{string} 用户名<br> * password-{string} 密码 * @param options -{Object} <br> * isNewTab -{boolean} 不同域时是否在新窗口打开登录页面 * @return {Promise} 返回包含iManager登录请求结果的Promise对象 */ static loginManager (url, loginInfoParams, options) { if (!Util.isInTheSameDomain(url)) { var isNewTab = options ? options.isNewTab : true this._open(url, isNewTab) return } var end = url.substr(url.length - 1, 1) var requestUrl = end === '/' ? url + 'icloud/security/tokens.json' : url + '/icloud/security/tokens.json' var params = loginInfoParams || {} var loginInfo = { username: params.userName && params.userName.toString(), password: params.password && params.password.toString() } loginInfo = JSON.stringify(loginInfo) var requestOptions = { headers: { 'Accept': '*/*', 'Content-Type': 'application/json' } } var me = this return FetchRequest.post(requestUrl, loginInfo, requestOptions).then(function (response) { response.text().then(function (result) { me.imanagerToken = result return result }) }) } /** * @description 清空全部验证信息 */ static destroyAllCredentials () { this.keys = null this.tokens = null this.servers = null } /** * @description 清空令牌信息 */ static destroyToken (url) { if (!url) { return } var domain = this._getTokenStorageKey(url) this.tokens = this.tokens || {} if (this.tokens[domain]) { delete this.tokens[domain] } } /** * @description 清空服务授权码 */ static destroyKey (id) { if (!id) { return } this.keys = this.keys || {} var key = this._getUrlRestString(id) || id if (this.keys[key]) { delete this.keys[key] } } static _open (url, newTab) { newTab = (newTab != null) ? newTab : true var offsetX = window.screen.availWidth / 2 - this.INNER_WINDOW_WIDTH / 2 var offsetY = window.screen.availHeight / 2 - this.INNER_WINDOW_HEIGHT / 2 var options = 'height=' + this.INNER_WINDOW_HEIGHT + ', width=' + this.INNER_WINDOW_WIDTH + ',top=' + offsetY + ', left=' + offsetX + ',toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no' if (newTab) { window.open(url, 'login') } else { window.open(url, 'login', options) } } static _getTokenStorageKey (url) { var patten = /(.*?):\/\/([^\/]+)/i var result = url.match(patten) if (!result) { return url } return result[0] } static _getUrlRestString (url) { if (!url) { return url } var patten = /http:\/\/(.*\/rest)/i var result = url.match(patten) if (!result) { return url } return result[0] } } SecurityManager.INNER_WINDOW_WIDTH = 600 SecurityManager.INNER_WINDOW_HEIGHT = 600 SecurityManager.SSO = 'https://sso.supermap.com' SecurityManager.ONLINE = 'http://www.supermapol.com' SuperMap.SecurityManager = SecurityManager