O2OA(翱途)通过服务来调用接口实现单点登录案例

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

创建接口

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

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

image (96).png

允许访问的地址表达式

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

172.16.1.5[0-6]

启用鉴权

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

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

image (97).png

点击“添加鉴权配置”:

image (98).png

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

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

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

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

填写完成后确定。

image (99).png

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

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

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

请求方法为:POST

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

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

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

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

若有收获,就点个赞吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/512352.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【计算机考研】408+数学全年备考规划

先回答题主问题,不看学校规定的教材是完全OK的,我就是全程跟着王道下来,高分上岸了。 计算机专业知识除非自己大一大二学完以后定期复习,其实大家到了该准备考研的时候都已经忘得差不多了,所以不用担心,就…

根据用户名称实现单点登录

一、参数格式 二、后端实现 Controller层 public class IAccessTokenLoginController extends BaseController {Autowiredprivate ISysUserService sysUserService;Autowiredprivate ISingleTokenServiceImpl tokenService;/*** 登录方法** return 结果*/PostMapping("/l…

神经网络推理优化方法总结

🎀个人主页: https://zhangxiaoshu.blog.csdn.net 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️,如有错误敬请指正! 💕未来很长,值得我们全力奔赴更美好的生活&…

HTTP代理扫描的技术解析(HTTP代理扫描的技术原理和使用方法)

HTTP代理扫描的技术解析 近年来,随着互联网的快速发展,HTTP代理扫描技术也日益成熟。HTTP代理扫描是指通过扫描网络中的HTTP代理服务器,获得有效代理的IP地址和端口,进而实现网络请求的转发。通过HTTP代理扫描,用户可…

只会Vue的我,用两天学会了react,这个方法您也可以

公众号:需要以下pdf,关注下方 2023已经过完了,让我们来把今年的面试题统计号,来备战明年的金三银四!所以,不管你是社招还是校招,下面这份前端面试工程师高频面试题,请收好。 背景 由…

游泳耳机哪种款式好?五大高分机型硬核推荐!

游泳,一项既能锻炼身体又能放松心情的运动。在水中的每一道波纹,每一次划手,都仿佛能带走我们生活中的疲惫与压力。而在这个过程中,音乐无疑是最棒的伴侣。一款好的游泳耳机,不仅能让我们在水中畅游的同时享受到高品质…

EUV光刻机,大结局?

前言 芯片号称现代社会的“工业粮食”,是信息产业的基石。自1958年集成电路诞生之日以来,芯片产业日益成为国民经济和社会发展的战略性、基础性、先导性产业。芯片深刻地改变了人类的生产生活方式,从手机、家电、汽车等以大众消费者为导向的…

Docker镜像仓库-Docker的私有镜像仓库的搭建

Docker镜像仓库 文章目录 Docker镜像仓库1.私有镜像仓库搭建1.1.简化版镜像仓库1.2.带有图形化界面版本1.3.配置Docker信任地址 2、私有仓库的拉取和推送 **镜像仓库( Docker Registry )**有公共的和私有的两种形式: 公共仓库:例如…

基于SpringBoot的网上订餐系统论文

摘 要 随着我国经济的飞速发展,人们的生活速度明显加快,在餐厅吃饭排队的情况到处可见,近年来由于新兴IT行业的空前发展,它与传统餐饮行业也进行了新旧的结合,很多餐饮商户开始通过网络建设订餐系统,通过专…

集团化日企统一平台管理,居然有那么多好处

你知道日本第一家在中国投资的企业是谁吗? 松下电器。 继松下之后,其他日本公司也开始陆续在中国投资发展。例如我们今天耳熟能详的丰田、电装、东芝、资生堂、永旺等等。 这些企业有一个共同的管理特点,即都采用集团化经营模式。随着在华…

基于 Vue3打造前台+中台通用提效解决方案(上)

基于 Vue3打造前台+中台通用提效解决方案 1、项目架构 本项目使用vite + vue3来实现前中台解决方案 2、为什么使用vite ? 因为,之前的项目一直都是使用webpack作为构建工具;vite出来这么久了,也没有用过;所以想在当前项目下进行使用; 2.1、为什么vite比webpack块? …

基于SSM SpringBoot vue个人博客网站

基于SSM SpringBoot vue个人博客网站 系统功能 首页 图片轮播 博客文章 搜索 登录注册 论坛 留言板 个人中心 我的收藏 后台管理 登录 个人中心 博客分类管理 博客文章管理 论坛管理 系统管理 管理员管理 注册用户管理 开发环境和技术 开发语言:Java 使用框架:…