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

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


推荐阅读
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 本文探讨了如何在Node.js环境中,通过Tor网络使用的SOCKS5代理执行HTTP请求。文中不仅提供了基础的实现方法,还介绍了几种常用的库和工具,帮助开发者解决遇到的问题。 ... [详细]
  • 深入解析SpringMVC核心组件:DispatcherServlet的工作原理
    本文详细探讨了SpringMVC的核心组件——DispatcherServlet的运作机制,旨在帮助有一定Java和Spring基础的开发人员理解HTTP请求是如何被映射到Controller并执行的。文章将解答以下问题:1. HTTP请求如何映射到Controller;2. Controller是如何被执行的。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 远程过程调用(RPC)是一种允许客户端通过网络请求服务器执行特定功能的技术。它简化了分布式系统的交互,使开发者可以像调用本地函数一样调用远程服务,并获得返回结果。本文将深入探讨RPC的工作原理、发展历程及其在现代技术中的应用。 ... [详细]
  • Java多重继承的替代方案及设计考量
    本文探讨了Java为何不支持多重继承,并深入分析了其背后的原理和替代方案。通过理解Java的设计哲学,开发者可以更好地利用接口和其他特性来实现复杂的类结构。 ... [详细]
  • CentOS 7.6环境下Prometheus与Grafana的集成部署指南
    本文旨在提供一套详细的步骤,指导读者如何在CentOS 7.6操作系统上成功安装和配置Prometheus 2.17.1及Grafana 6.7.2-1,实现高效的数据监控与可视化。 ... [详细]
  • 本文详细介绍了Java库XChart中的XYSeries类下的setLineColor()方法,并提供了多个实际应用场景的代码示例。 ... [详细]
  • 本文将详细介绍通过CAS(Central Authentication Service)实现单点登录的原理和步骤。CAS由耶鲁大学开发,旨在为多应用系统提供统一的身份认证服务。文中不仅涵盖了CAS的基本架构,还提供了具体的配置实例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • HTTPS与TLS/SSL协议详解:握手及记录协议
    HTTPS,即HTTP over TLS/SSL,通过在HTTP通信层引入安全协议,确保数据传输的安全性。本文将深入探讨TLS/SSL协议的基本概念、HTTPS的必要性,以及TLS握手和记录协议的工作原理。 ... [详细]
  • 本文探讨了SSDP(简单服务发现协议)和WSD(Web服务发现)协议,特别是SSDP如何通过固定多播地址239.255.255.250:1900实现局域网内的服务自发现功能。文中还详细介绍了SSDP协议的关键操作类型及其应用场景。 ... [详细]
  • 在Java应用程序开发过程中,FTP协议被广泛用于文件的上传和下载操作。本文通过Jakarta Commons Net库中的FTPClient类,详细介绍如何实现文件的上传和下载功能。 ... [详细]
  • 性能测试工具的选择与应用
    本文探讨了性能测试工具的重要性及其在软件测试中的作用,重点介绍了选择合适性能测试工具的考量因素,并对几种常用的性能测试工具进行了对比分析。 ... [详细]
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社区 版权所有