本文介绍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: https://github.com/brix/crypto-js

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 = 0 let 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-8
byte[] unencryptedByteArray = unencryptedString.getBytes("UTF8");
// Encrypt
byte[] encryptedBytes = encryptCipher.doFinal(unencryptedByteArray);
// Encode bytes to base64 to get a string
byte [] encodedBytes = Base64.encode(encryptedBytes, Base64.DEFAULT);
return new String(encodedBytes);
}
public String decryptBase64 (String encryptedString) throws Exception {
// Encode bytes to base64 to get a string
byte [] decodedBytes = Base64.encode(encryptedString.getBytes(), Base64.DEFAULT);
// Decrypt
byte[] unencryptedByteArray = decryptCipher.doFinal(decodedBytes);
// Decode using utf-8
return new String(unencryptedByteArray, "UTF8");
}
}

开源协同OA办公平台教程:O2OA服务管理中,接口的调用权限的更多相关文章

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

    O2OA平台搭建 O2OA的开发环境非常简单,安装服务器后即可通过浏览器进行开发了和使用.具体可参考文档库中的其他文档,有比较详细的介绍,这里就不再赘述了. Arduino开发发环境搭建 安装Ardu ...

  2. 6 款国外开源web oa办公系统(转)

    国外的开源产品较多,而且大多提供免费的社区版本,oa办公系统也不例外. 1.eGroupware eGroupware是一个多用户,在以PHP为基础的API上的定制集为基础开发的,以WEB为基础的工作 ...

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

    O2OA平台是一个企业办公类系统的低代码开发平台,更够方便的开发和部署协同办公.流程管理等应用,但它能做的远不止这些,今天这个案例就为大家介绍一下,O2OA可以做的更多. 最近对养鱼产生了浓厚的兴趣, ...

  4. 开源OA办公平台搭建教程:O2OA表单中的事件

    1. 概述 我们设计表单的时候经常会有这样的需求:在表单或者组件加载前/加载后,能够执行一些脚本来改变表单或组件的样式和行为.或者用户在点击组件的时候能够执行脚本.表单的事件就是为这样的场景而设计. ...

  5. 开源OA办公平台搭建教程:基于nginx的快速集群部署——端口分发

    主机信息 主机1:172.16.98.8(linux) 主机2:172.16.98.9(linux) 集群需求 172.16.98.8:WEB服务器,应用服务器,文件存储服务器,中心服务器 172.1 ...

  6. 开源OA办公平台功能介绍:应用市场-固定资产管理(一)功能设计

    概述 应用市场-固定资产管理,是用来维护管理企业固定资产的一个功能.其整个功能包括对固定资产的台账信息.领用.调拨.借用.维修.盘点.报废等一整个生命周期的动态管理过程.力求客户安装就可以使用. 本应 ...

  7. 开源OA办公系统的“应用市场”,能够为协同办公开拓什么样的“前路”?

    在我们的日常生活中,应用市场这个词,总是与智能手机划上等号,不管使用的是iPhone还是安卓,总会接触到手机上的APP应用市场,我们可以在应用市场中,选择自己所需要的APP应用软件,下载使用后,可以让 ...

  8. dzzoffice协同办公平台与onlyoffice在线协作平台安装与部署

    1.安装dzzoffice协同办公平台 DzzOffice是一套开源办公套件,适用于企业.团队搭建自己的 类似“Google企业应用套件”.“微软Office365”的企业协同办公平台. 官网地址:h ...

  9. 协同办公平台Worktile体验分享(转)

    自从组建团队以来,做的每一个项目.每一次活动,电脑里就会存放了N个不同名称的相同文档, 工作内容.资源文档非常零散,严重影响了工作效率. 之前用Dropbox共享文档,结果被墙了.用印象笔记,结果一个 ...

随机推荐

  1. Node.js 应用全链路追踪技术——[全链路信息获取]

    全链路追踪技术的两个核心要素分别是 全链路信息获取 和 全链路信息存储展示. Node.js 应用也不例外,这里将分成两篇文章进行介绍:第一篇介绍 Node.js 应用全链路信息获取, 第二篇介绍 N ...

  2. Djangoda搭建——初步使用

    使用pycharm专业版>选择Django项目即可完成搭建 注:本次使用的是python3的虚拟环境,这里注意了这里使用的是python的集成环境Anaconda3,个人感觉比较好用进行pyth ...

  3. Linux查看英伟达GPU信息

    命令: nvidia-smi 结果:

  4. 5-21python数据类型

    一.字符串,是不可变数据类型,所有字符串的方法都不会修改字符串的值,使用字符串的方法后都是生成了一个新的字符串.就因为字符串是不可变变量! 字符串的方法 1. strip(),默认去空格,但是当()中 ...

  5. MySql分表、分库、分片和分区的区别

    一.前言 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈.需要进行数据的处理,采用的手段是分区.分片.分库.分表. 二.分片(类似分库) 分片是把数据库横向扩展(Scale Out)到多个 ...

  6. ❤️❤️用最简单的方法在Webstorm中打开已存在项目 和 新建Vue项目 (亲测实用)❤️❤️

    ​ 目录 一:打开已存在项目时 二:新建一个vue项目 使用webstorm创建vue项目创建vue项目各个公司用的工具都不一样 最常见的有HBuilder X,WebStorm,Visual Stu ...

  7. 学习PHP中统计扩展函数的使用

    做统计相关系统的朋友一定都会学习过什么正态分布.方差.标准差之类的概念,在 PHP 中,也有相应的扩展函数是专门为这些统计相关的功能所开发的.我们今天要学习的 stats 扩展函数库就是这类操作函数. ...

  8. Jmeter系列(28)- 性能指标(1) | 常见性能指标

    TPS 概念 TPS (transaction per second):意思是每秒事务数,具体事务的定义,都是人为的,可以一个接口.多个接口.一个业务流程等等.一个事务是指事务内第一个请求发送到接收到 ...

  9. 如何在word中美观地插入编程代码

    零.缘起 在整理Java笔记时,想把代码直接贴到word文档中,原来一直截图很麻烦,所以找到以下方法. 思想:问题比答案更重要!你能想到问题,才知道去百度搜索. 一.打开网站 http://www.p ...

  10. php--laravel --debug--mac

    1>安装debug 一.下载xdebug文件 1.将phpinfo();的信息全部输入网址中的框,得到适配的xdebug版本: 网址:http://xdebug.org/wizard.php 2 ...