热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开源OA协同办公平台搭建教程:服务管理中接口的调用权限

O2OA应用开发平台是兰德纵横网络技术股份有限公司精心打造的一款开源办公产品,是使用JavaEE技术栈,分布式架构设计的真正全代码开源的企业应用定制化开

O2OA应用开发平台是兰德纵横网络技术股份有限公司精心打造的一款开源办公产品,是使用JavaEE技术栈,分布式架构设计的真正全代码开源的企业应用定制化开发平台,平台既可以支持小企业的OA协同办公系统快速搭建,也能支持复杂的集团化大型协同门户及业务平台建设,以最低成本,搭建一个OA办公系统。

本文介绍O2OA服务管理中,接口的权限设定和调用方式。

适用版本:5.4及以上版本


创建接口

具有服务管理设计权限的用户(具有ServiceManager角色或Manager角色)打开“服务管理平台”,进入接口配置视图,点击左上角的新建按钮,可创建一个新的接口。

新建接口后,在右侧属性栏中有两个配置和调用权限有关,一个是“允许访问的地址表达式”,一个收是“启用鉴权”。


允许访问的地址表达式

此处允许输入一个正则表达式,用来匹配调用接口的客户端的Remote_Addr,只有匹配通过,接口才允许执行。例如只允许172.16.1.50到172.16.1.56地址调用接口,可以在此处输入:

172\.16\.1\.5[0-6]

启用鉴权

此处选择“是”的话,就需要在调用接口时传入client名称和一个加密后的token。所以我们先需要一组鉴权配置。

具有管理员权限的用户(具有Manager角色),打开“系统设置”-“系统SSO配置”,找到“鉴权配置”。

点击“添加鉴权配置”:

此处需要配置一个名称和密钥。

名称:可随意填写,就是我们在调用接口或进行SSO时要传入的client参数。

密钥:可随意填写,用于后续加密,最少8位。

此处我们假设名称填写:oa;密钥填写:platform

填写完成后确定。

然后我们就可以使用此鉴权配置来调用接口了。


接口调用

接口调用的的地址在接口属性栏中有显示:

当启用鉴权后的接口调用地址为:

http://develop.o2oa.net:20030/x_program_center/jaxrs/invoke/{name}/client/{client}/token/{token}/execute

请求方法为:POST

地址中的{name}为接口的名称或别名;

地址中的{client}为鉴权的名称;

地址中的{token}为:用户名#1970年毫秒数 使用鉴权密钥经过3DES加密后的值。


Javascript加密代码样例

我们使用CryptoJS进行DES加密。(GitHub: GitHub - brix/crypto-js: Javascript library of crypto standards.)

function crypDES (value, key) {var keyHex = CryptoJS.enc.Utf8.parse(key);var xtoken = CryptoJS.DES.encrypt(value, keyHex, {mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});var str = xtoken.ciphertext.toString(CryptoJS.enc.Base64);str = str.replace(/=/g, "");str = str.replace(/\+/g, "-");str = str.replace(/\//g, "_");return str;
},

IOS加密代码样例

/// o2oa DES加密 @param publicKey 加密公钥
func o2DESEncode(code: String, publicKey: String) -> String? {if let encode = desEncrypt(code: code, key: publicKey, iv: "12345678", options: (kCCOptionECBMode + kCCOptionPKCS7Padding)) {let first = encode.replacingOccurrences(of: "+", with: "-")let secOnd= first.replacingOccurrences(of: "/", with: "_")let token = second.replacingOccurrences(of: "=", with: "")return token}else {print("加密错误")return nil}
}
/// DES 加密
func desEncrypt(code: String, key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String? {if let keyData = key.data(using: String.Encoding.utf8),let data = code.data(using: String.Encoding.utf8),let cryptData = NSMutableData(length: Int((data.count)) + kCCBlockSizeDES) {let keyLength = size_t(kCCKeySizeDES)let operation: CCOperation = UInt32(kCCEncrypt)let algoritm: CCAlgorithm = UInt32(kCCAlgorithmDES)let options: CCOptiOns= UInt32(options)var numBytesEncrypted :size_t = 0let cryptStatus = CCCrypt(operation,algoritm,options,(keyData as NSData).bytes, keyLength,iv,(data as NSData).bytes, data.count,cryptData.mutableBytes, cryptData.length,&numBytesEncrypted)if UInt32(cryptStatus) == UInt32(kCCSuccess) {cryptData.length = Int(numBytesEncrypted)let base64cryptString = cryptData.base64EncodedString()return base64cryptString}else {return nil}}return nil
}


Android加密代码样例

fun o2DESEncode(code: String, publicKey: String): String {val sutil = CryptDES.getInstance(publicKey)var encode = ""try {encode = sutil.encryptBase64(code)Log.d(LOG_TAG,"加密后code:$encode")encode = encode.replace("+", "-")encode = encode.replace("/", "_")encode = encode.replace("=", "")Log.d(LOG_TAG,"替换特殊字符后的code:$encode")}catch (e: Exception) {Log.e(LOG_TAG,"加密失败", e)}return encode
}public class CryptDES {private Cipher encryptCipher = null;private Cipher decryptCipher = null;private static CryptDES des = null;public static CryptDES getInstance(String des_key) {try {DESKeySpec key = new DESKeySpec(des_key.getBytes());SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");des = new CryptDES(keyFactory.generateSecret(key));} catch (Exception e) {e.printStackTrace();}return des;}private CryptDES(SecretKey key) throws Exception {encryptCipher = Cipher.getInstance("DES");decryptCipher = Cipher.getInstance("DES");encryptCipher.init(Cipher.ENCRYPT_MODE, key);decryptCipher.init(Cipher.DECRYPT_MODE, key);} public String encryptBase64 (String unencryptedString) throws Exception {// Encode the string into bytes using utf-8byte[] unencryptedByteArray = unencryptedString.getBytes("UTF8");// Encryptbyte[] encryptedBytes = encryptCipher.doFinal(unencryptedByteArray);// Encode bytes to base64 to get a stringbyte [] encodedBytes = Base64.encode(encryptedBytes, Base64.DEFAULT);return new String(encodedBytes);}public String decryptBase64 (String encryptedString) throws Exception {// Encode bytes to base64 to get a stringbyte [] decodedBytes = Base64.encode(encryptedString.getBytes(), Base64.DEFAULT);// Decryptbyte[] unencryptedByteArray = decryptCipher.doFinal(decodedBytes);// Decode using utf-8return new String(unencryptedByteArray, "UTF8");}
}

(转自公众号:浙江兰德网络)


推荐阅读
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • 代理模式的详细介绍及应用场景
    代理模式是一种在软件开发中常用的设计模式,通过在客户端和目标对象之间增加一层中间层,让代理对象代替目标对象进行访问,从而简化系统的复杂性。代理模式可以根据不同的使用目的分为远程代理、虚拟代理、Copy-on-Write代理、保护代理、防火墙代理、智能引用代理和Cache代理等几种。本文将详细介绍代理模式的原理和应用场景。 ... [详细]
author-avatar
soar
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有