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");}
}

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

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

  1. 开源OA协同办公平台搭建教程丨服务器端命令:数据导入导出及配置

    O2OA应用开发平台是一款开源办公产品,是使用JavaEE技术栈,分布式架构设计的真正全代码开源的企业应用定制化开发平台,平台既可以支持小企业的OA协同办公系统快速搭建,也能支持复杂的集团化大型协同门 ...

  2. 开源OA协同办公平台搭建教程:开源O2OA中log4j2使用配置

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

  3. 开源OA协同办公平台使用教程:O2OA如何集成金格office控件

    O2OA平台是一个开源的企业办公类系统,为了方便实现在线编辑 word.excel.ppt文件,与金格iWebOfficeZZKK智能文档中间件产品在线编辑功能集成.本文主要介绍如何将O2OA集成金格 ...

  4. 开源OA协同办公平台使用教程:O2OA如何集成yozo

    O2OA平台是一个开源的企业办公类系统,为了方便实现在线编辑 word.excel.ppt文件,与永中yozo在线编辑功能集成.本文主要介绍如何将O2OA集成yozo在线编辑功能. 一.总体思络: y ...

  5. 普歌-腾讯云短信+使用node发送短信(3种方法API、SDK)、封装工具、搭建web服务、写接口、调用接口发送短信、时效性判断、验证验证码的正确性(下)

    普歌-结合腾讯云短信服务+node搭建一个简单的发送短信web小项目 涉及技术: 腾讯云服务 后端服务:node+express 前端搭建:html+js 前言:本来这篇博客应该很早就发了,中间有一些 ...

  6. 开源OA协同办公搭建教程:使用认证鉴权对服务访问进行限制(invoke)

    本篇文章介绍的是开源的协同办公项目O2OA如何使用认证鉴权对服务访问进行限制(invoke). 默认情况下创建的服务是允许匿名访问的,这样创建的服务可以直接通过url访问执行,如果需要进行鉴权限制,那 ...

  7. 开源OA办公平台搭建教程:O2OA+Arduino实现物联网应用(五)

    我们已经登录到了O2OA服务器,本章就要连接Websocket,接收服务器的消息. 创建O2IOTWebsocket类 在o2iot目录下创建文件:O2IOTWebsocket.h,代码如下: #if ...

  8. 开源OA办公平台搭建教程:O2OA+Arduino实现物联网应用(四)

    之前我们通过O2IOTServer类已经实现了设备的初始化配置,现在我们需要使用配置信息,连接到可以用的WiFi,并连接登录到O2OA服务器. 创建O2IOTClient类 在o2iot目录下创建文件 ...

  9. 值得推荐的开源OA协同办公系统

    随着企业内部信息化管理的重要程度越来越高,我国OA协同办公产品近年来得以快速发展.其中开源办公产品因为其开源免费的特性受到众多中小企业的喜爱.下面就来说一说那些开源协同产品中的优秀代表们. NO.1: ...

最新文章

  1. MS08-025 win32k.sys NtUserFnOUTSTRING Privilege Escalation Exploit
  2. suse 内核编译安装_升级SUSE Linux内核的完整步骤!
  3. k8s 查看ip地址属于哪个pod_Kubernetes Pod 如何获取 IP 地址
  4. tomcat7的数据库连接池tomcatjdbc的25个优势
  5. Win11系统怎样设置更改密码
  6. 中修改环境变量_系统小技巧:彻底弄懂Windows 10环境变量
  7. 通过日志分析mysql访问量,Mysql 慢查询和慢查询日志分析
  8. CodeForces - 95C Volleyball(建边+dij)
  9. 表格求和和计算机不一致6,(电子行业企业管理)计算机电子表格公式应用常见错误及处理(6页)-原创力文档...
  10. 李宏毅(2020)作业2-hw2_classification
  11. 中国药典 android,中国药典在线查询_中国药典v2.05.03安卓版
  12. figma的一些用法(一)
  13. 1.2.4 常用的数据模型 1.2.5 层次模型 1.2.6 网状模型
  14. php管理员密码,PHPWIND得到管理员密码的方法.
  15. 大学一路走来,学习互联网全靠这几个网站,最终拿下了一把offer
  16. 以太网模块支持SCADA 软件通过三菱以太网协议连接
  17. LDO稳压器工作原理
  18. WPF中的树:LogicalTree、VisualTree
  19. 虚拟机安装linux(centos),详细
  20. 关于辞职创业的思考(完整)

热门文章

  1. 山东大学-飞桨人工智能教育创新中心正式挂牌,打造区域产教融合新范式
  2. 计算机考试的时候有文字解析吗,计算机考试解析.doc
  3. K210实现人脸识别(附代码解读)
  4. 文化与科技的交织,华为P50 Pro与一曲长城谣
  5. (完整源码)GPS系统源码,GPSBDpro——SIM卡状态查询
  6. Workflow:Workflow 百科
  7. WaitForSingleObject与事件、信号量、互斥、临界区的用法
  8. #Reading Paper#STAM:A Spatiotemporal Aggregation Method for Graph Neural Network-based Recommendatio
  9. [存储]NVMe-4-数据结构
  10. 智慧物联网的运用领域