关键词:O2OA,约定密钥,认证集成,SSO,系统集成,单点认证

O2OA平台提供灵活的系统集成方案,让企业信息平台与各类第三方系统进行集成。本篇主要介绍如何在O2OA中使用简单的约定密钥的方案与其他系统实现单点登入


O2OA提供多种单点认证配置,如约定密钥的单点认证配置,OAuth2客户端与服务端配置支持。本文主要讲解如果使用约定密钥实现外部系统与O2OA的单点认证。

image


关于用户账号同步

通过单点认证的系统中拥有统一的用户登录账号,或者进行某种账号映射是单点认证登录设置的基础。


单点认证配置入口

在系统菜单-控制面板-系统设置中定制您的系统。点击系统菜单,找到“系统SSO配置”,点击打开

image.png


约定密钥的单点认证

在控制面板 - 系统设置 - 基础配置 - 系统SSO配置界面添加一个SSO配置:

image

当然也可以在服务器配置文件:o2server/config/token.json中进行配置,如果config目录中没有该配置文件,可以从o2server/configSample目录中拷贝文件token.json到o2server/config目录后再进行配置文件修改


"ssos": [
    {
      "enable": true,
      "client": "ERP",
      "key": "password"
    }
  ],
参数配置:
"enable": "是否启用",
"client": "名称",
"key": "密钥"


数据加密工具类(Java)

Crypto.java
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
/**
* encrypt and decrypt utils
* @author O2OA
*
*/
public class Crypto {
    private static final String utf8 = "UTF-8";
    private final static String DES = "DES";
    private final static String cipher_init = "DES";
    public static String encrypt(String data, String key) throws Exception {
 byte[] bt = encrypt(data.getBytes(), key.getBytes());
 String str = Base64.encodeBase64URLSafeString(bt);
 return URLEncoder.encode( str, utf8 );
    }
    public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
 // 生成一个可信任的随机数源
 SecureRandom sr = new SecureRandom();
 // 从原始密钥数据创建DESKeySpec对象
 DESKeySpec dks = new DESKeySpec(key);
 // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
 SecretKey securekey = keyFactory.generateSecret(dks);
 // Cipher对象实际完成加密操作
 Cipher cipher = Cipher.getInstance(cipher_init);
 // 用密钥初始化Cipher对象
 cipher.init(Cipher.ENCRYPT_MODE, securekey, sr);
 return cipher.doFinal(data);
    }
    public static String decrypt(String data, String key) throws IOException, Exception {
 if (StringUtils.isEmpty(data)) {
    return null;
 }
 String str = URLDecoder.decode(data, utf8);
 byte[] buf = Base64.decodeBase64(str);
 byte[] bt = decrypt(buf, key.getBytes());
 return new String(bt);
    }
    public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
 // 生成一个可信任的随机数源
 SecureRandom sr = new SecureRandom();
 // 从原始密钥数据创建DESKeySpec对象
 DESKeySpec dks = new DESKeySpec(key);
 // 创建一个密钥工厂,然后用它把DESKeySpec转换成SecretKey对象
 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES);
 SecretKey securekey = keyFactory.generateSecret(dks);
 // Cipher对象实际完成解密操作
 Cipher cipher = Cipher.getInstance(cipher_init);
 // 用密钥初始化Cipher对象
 cipher.init(Cipher.DECRYPT_MODE, securekey, sr);
 return cipher.doFinal(data);
    }
}


从第三方系统登录O2OA

第三方系统使用数据加密登录O2OA

/**
     * 从系统中获取已经登录第三方系统的用户账号,并且进行账号和信息加密,送到到O2OA进行登录
*/
//sso名称和密码是在O2OA平台中约定的配置项
String sso_client_name = "ERP";
String sso_key = "password";
//sso_url在O2OA平台中准备好的单点登录页面模板
//文件路径:o2server/servers/webserver/x_desktop/sso.html
String sso_url = "http://o2oa_hostip:port/x_desktop/sso.html";
//login_uid为在第三方系统中识别的登录账号名,这里理解为双方系统账号是统一的账号
String login_uid = "user1";
//获取当前时间
long time = new Date().getTime();
//将用户账号和登录时间一起使用sso_key进行信息加密
String xtoken = null;
try {
    xtoken = Crypto.encrypt( login_uid + "#" + time, sso_key );
    response.sendRedirect( sso_url + "?client=" + sso_client_name + "&xtoken=" + xtoken );
} catch (Exception e) {
    e.printStackTrace();
}

信息加密后,将用户的登录账号(O2OA可以识别的账号)以及登录时间一起使用约定的密码进行加密,然后发送到O2OA的sso.html


O2OA相关修改(sso.html)

文件路径:o2server/servers/webServer/x_desktop/sso.html 修改登录相关的代码

COMMON.setContentPath("/x_desktop");
COMMON.AjaxModule.load("mwf", function(){
    MWF.getJSON("res/config/config.json", function(config){
        getServiceAddress(config, function(address){
            var uri = new URI(window.location.toString());
            var xtoken = uri.getData("xtoken");
            var client = uri.getData("client");
            if (xtoken){
                var res = new Request.JSON({
                    url: address+"/jaxrs/sso",
                    secure: false,
                    method: "POST",
                    noCache: true,
                    withCredentials: true,
                    onSuccess: function(responseJSON, responseText){
                         window.location = "/index.html" ;
                    }.bind(this),
                    onFailure: function(xhr){
                         window.location = "/index.html";
                    }.bind(this),
                    onError: function(text, error){
                        window.location = "/index.html";
                    }.bind(this)
                });
                res.setHeader("Content-Type", "application/json; charset=utf-8");
                var json = {"token": xtoken, "client": client};
                res.send(JSON.encode(json));
            }else{
                window.location = "/index.html";
            }
});
});


系统登录成功,可以指定到单独的门户页面,或者打开指定应用界面。登录失败后,也可以指定到单独的错误处理页面。


Java加密获取token方式

String login_uid = "test"; 
long time = new Date().getTime(); 
String sso_key = "12345678";
String xtoken = Crypto.encrypt( login_uid + "#" + time, sso_key );


JS脚本打开URL脚本如下

var client = "unicom";
var xtoken = "5no3eDzdxrU1-cV_7F7e1gZq-RKMrJ-X" 
var redirect= "http://127.0.0.1/x_desktop/app.html?app=process.TaskCenter" 
var url = "http://127.0.0.1/x_desktop/sso.html" + "?client=" + client + "&xtoken=" + xtoken + "&redirect=" + redirect ;  
window.open(url)


推荐文章:

服务集成-在O2OA中使用系统o2.DL构建弹出框
2021-03-15
O2OA允许用户对表单进行尝试定制以满足各种特殊业务的需求。本文主要介绍如何在O2OA中使用系统o2.DL构建弹出框的相关功能。
服务集成-表单界面上自定义弹出选择器功能
2021-03-15
O2OA允许用户对表单进行自由的功能定制,可以增加自定义的组件和插件。本文介绍如果在表单界面上自定义弹出选择器的功能。
系统维护-如何压缩过大的H2数据库文件
2021-02-25
平台自带的H2数据库在使用过程中会随着数据量的增加而增长,但是并不会在删除数据后自动缩小。所以O2OA提供了数据库压缩命令用于缩小数据库占用的空间。
常见问题-如何使用脚本控制流程自动流转
2021-03-24
   vardata2={};data2["routeName"]=“送******”;data2["opinion"]="同意(超时)";vartaskid=
表单-HTML编辑器(TinyMCE)的配置
2021-10-22
简介V6.4版本中,O2OA平台的表单中集成了新的HTML编辑-TinyMCE。TinyMCE是一个轻量级、基于浏览器的,所见即所得编辑器,支持目前流行的各种浏
开发知识-鲲鹏(ARM)麒麟操作系统如何替换yum源?
2021-02-07
有时候会遇到系统自带的麒麟的yum源失效,就像我们遇到的麒麟公司护网的时候,yum安装任何软件都无法成功,连接无响应,所以需要安装合适的yum源中标麒麟-华为A
企业网盘使用手册
2021-02-19
O2OA企业网盘可以集中储存、管理公司内的文件,确保数字资产安全,支持远程访问,将文件分享给个人、组织、群组。
论坛管理
2021-09-23
O2OA平台论坛管理为企业提供了一个员工公开交流的场所,经过配置后,论坛可以拥有丰富的栏目、版块,可以进行版块的权限设置,可见性,发贴回复权限设置。
开发知识-React篇:在O2OA门户页面中使用React
2021-02-07
  O2OA提供了门户平台,使用可视化方式设计页面,用于设计系统主页、列表等系统中的各类页面,在一定程度上降低了开发者的技能要求。但是对于有经验的前端开发人员,
快速入门-自定义表数据分页样例
2021-02-07
一、分页获取自定义表数据接口代码var getRowCount = function(tableFlag,where){    var data = {};  

results matching ""

    No results matching ""