热门标签 | 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");}
}

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


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 标题: ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 在重复造轮子的情况下用ProxyServlet反向代理来减少工作量
    像不少公司内部不同团队都会自己研发自己工具产品,当各个产品逐渐成熟,到达了一定的发展瓶颈,同时每个产品都有着自己的入口,用户 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • FeatureRequestIsyourfeaturerequestrelatedtoaproblem?Please ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
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社区 版权所有