NC6X单点登录设计文档说明

 前言

  因为业务场景需要,第三方系统有些工作需要经常到NC系统里做,如果每次去NC系统做业务单据,都需要反复登录,导致客户使用体验不是很好,所以需要开发实现从第三方系统单点登录到NC系统,提高客户满意度。

单点登录名词解释

单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

特别说明:

  本方案是基于用友集提供的NC63单点登录方案说明文档进行二次修改,本篇文章不仅是为了记录个人开发需要,也同样提供给广大开发者们。

1、详述方案说明

  想要单点登录到NC,首先需要在服务器端向NC服务器注册将要登录的用户的信息以及其他一些需要的信息,这些信息将被保存在NC服务器上,通过ssoKey进行关联映射。在完成注册信息后,客户端在登录时需要提供ssoKey,通过该值获得登录用户的相关信息,进入NC系统。

2、注册登录信息

NC系统提供了一个Servlet来注册用户登录信息。访问该servlet的URL格式基本为:

http://host:port/service/ssoRegServlet,其后面可以跟随多个参数。

===参数信息===

【userCode】:

    指定用户编码,该参数必须提供,不能省略。

【ssoKey】:

    指定映射登录信息的键值,并在登录时需要提供该值。该值要求唯一,如果在注册时没有提供该值,NC系统会自动生成一个ssoKey的值,并在返回的Servlet流中输出该值。

【busiCenter】:

    指定用户所属的账套编码,该值可以忽略。如果忽略该值,并且在多个账套中都存在userCode用户,那么会让终端用户选择账套。

【groupCode】:

    指定登录的集团编码,该值可以忽略。

【langCode】:

    指定登录的语种,该值可以忽略,默认为中文。

示例:

http://host:port/ service/ssoRegServlet?ssoKey=16354820401&userCode=zhangsan 
这个URL表示将以用户zhangsan的身份登录,注册信息的键值为16354820401。

2.1、登录NC系统

  在完成了用户登录信息的注册后,客户端就可以以注册的ssoKey值来登录NC系统了,登录NC系统的ssoKey值以URL参数的形式提供。http://host:port/login.jsp?ssoKey=keyvalue。

对于前面的示例

http://host:port/ service/ssoRegServlet?ssoKey=16354820401&userCode=zhangsan

登录时的URL为:http://host:port/login.jsp?ssoKey=16354820401

2.2、根据功能节点打开NC界面

打开nc系统的人员页面:ssoKey例如还是上面的令牌,nodeid=10140PSN是人员的功能注册编码

http://127.0.0.1/login.jsp?ssoKey=123459483230949&clienttype=portal&uiloader=nc.uap.lfw.applet.PortalUILoader&nodeid=10140PSN 

2.3、自定义uiLoader打开NC任意界面 

  在上一章节中是根据功能节点打开列表界面,那么如何打开单据卡片界面呢,或者如何打开流程卡片界面等等。所以需要自己开发一个uiLoader类进行处理,如下图所示,如何集成打开一个人员卡片界面。

开发过程:

2.3.1、 编写java类

定义一个CustomPortalUILoader类,它继承了SSOLoader类。

示例代码:

package nc.demo.bx.uiloader;

import java.awt.Component;
import java.awt.Dimension;

import nc.bs.framework.common.NCLocator;
import nc.desktop.ui.WorkbenchEnvironment;
import nc.funcnode.ui.FuncletInitData;
import nc.funcnode.ui.FuncletWindowLauncher;
import nc.itf.uap.bbd.func.IFuncRegisterQueryService;
import nc.login.sso.ui.SSOLoader;
import nc.sfbase.client.ClientToolKit;
import nc.ui.bd.pub.BDFuncletInitData;
import nc.ui.pub.msg.PfLinkData;
import nc.ui.uap.sf.SFClientUtil;
import nc.vo.bd.psn.PsndocVO;
import nc.vo.pub.BusinessException;
import nc.vo.sm.funcreg.FuncRegisterVO;

public class CustomPortalUILoader extends SSOLoader {

	@Override
	public void appletInited() {
		//父窗体
		Component parent = WorkbenchEnvironment.getInstance().getWorkbench();
		String param = ClientToolKit.getAppletParam("nodeId");
		String systemcode="local";//默认系统编码
		//功能注册节点
		String funCode=param;
		//人员pk
		String pk_psndoc = ClientToolKit.getAppletParam("pk_psndoc");
		if(param.contains(":")){
			funCode=param.split(":")[0];
			systemcode=param.split(":")[1];
		}
		
		IFuncRegisterQueryService service = NCLocator.getInstance().lookup(IFuncRegisterQueryService.class);

        FuncRegisterVO FrvO=null;
		try {
			FrvO = service.queryFunctionByCode(funCode);//功能节点编号
		} catch (BusinessException e) {
		}

//打开界面的三种方式如下:
		
//**********第一种:打开流程单据卡片界面*********************************************************************
//        PfLinkData pflink = new PfLinkData();
//
//        pflink.setBillID("1001ZZ1000000000000Q"); // 本单据ID
//
//        pflink.setBillType("SALE"); // 本单据类型
//
//        pflink.setSourceBillType("SALE"); // 上游单据类型
//
//        pflink.setPkOrg("0001ZZ1000000000074A"); // 公司
//
//        int height = ClientToolKit.getUserHeight()-40;
//
//        int width = ClientToolKit.getUserWidth()-40;
//        FuncletWindowLauncher.openFuncNodeForceModalDialog(null, frvO,new FuncletInitData(1, pflink),null, true, new Dimension(width,height),null);
//  
		
//**********第二种:打开档案卡片界面*************************************************************************
        PsndocVO psndocvo = new PsndocVO();
		psndocvo.setPrimaryKey(pk_psndoc);
		BDFuncletInitData bdlinkdata = new BDFuncletInitData(null, 3, psndocvo);
		int height = ClientToolKit.getUserHeight()-40;
		int width = ClientToolKit.getUserWidth()-40;
		//模态窗体弹出对话打开
		//FuncletWindowLauncher.openFuncNodeForceModalDialog(null, FrvO,new FuncletInitData(3, bdlinkdata),null, true, new Dimension(width,height),null);
		//非模态窗体弹出对话框框架打开
		//FuncletWindowLauncher.openFuncNodeFrame(parent, FrvO, new FuncletInitData(3, bdlinkdata), null,false);
		//非模态窗体在原来窗体页签打开
		FuncletWindowLauncher.openFuncNodeInTabbedPane(parent, FrvO, new FuncletInitData(3, bdlinkdata), null,false);
		
//**********第三种:根据功能注册节点打开列表界面*********************************************************************		
		//SFClientUtil.open(parent, funCode);        
        
		String[] script = new String[]{"if(opener)opener.ncNodeAppletMap.put('"+systemcode+"',findNCApplet())"};
		ClientToolKit.callJavaScript("eval", script);
	}

}

2.3.2、部署

  部署到nchome中对用模块的client中,我的测试模块是lfwdemo。如图:

2.3.3、测试

1、首先令牌注册,在IE浏览器中,输入下面url。注意:帐套编码busiCente最好是填写上,否则在登录的时候要求选择帐套。

http://127.0.0.1/service/ssoRegServlet?ssoKey=123459483230949&userCode=admin&busiCenter=dev

2、 然后在IE浏览器中,输入下面url,就可以直接打开人员的卡片界面了

http://127.0.0.1/login.jsp?ssoKey=123459483230949&clienttype=portal&uiloader=nc.demo.bx.uiloader.CustomPortalUILoader&nodeid=10140PSN&pk_psndoc=1001ZZ1000000000000Q

3、单点登录配置文件详述

单点登录的配置文件路径为${NCHOME}\ierp\sf\ssoConfig.xml,该文件默认的内容如下。

<?xml version="1.0" encoding="UTF-8"?>
<SSOConfig>
	<regTimeOut>200</regTimeOut>
	<authenticator classname="nc.sso.bs.DefaultSSOAuthenticator">
		<listParam key="IPAddress">
			<string>127.0.0.1</string>
		</listParam>
	</authenticator>
</SSOConfig>

在这个配置文件中主要可以配置两个信息

1 )注册信息的超时设置

2 )注册时的验证处理类

3.1、注册信息的超时设置

  当用户注册完用户的登录信息后,在还没有进行登录之前,注册的登录信息将保存在NC系统中。在用户开始登录NC时,该注册信息才会从NC系统中被清除。

如果由于某种原因,用户没有触发登录操作,那么注册信息将在超时后,被系统自动清除掉,这个超时的时间值的配置是在配置文件中的<regTimeOut>标签项配置的,单位为秒。默认值为200秒。

如果用户是在超时以后才登录NC,那么登录将会失败,会提示找不到注册信息。

3.2、注册时的验证处理

由于只要向NC系统中注册了用户的登录信息,就可以单点登录到NC。所以从安全考虑,需要再注册用户的登录信息时进行权限验证。

单点登录注册时采用的验证类的配置是在配置文件中的< authenticator >标签项配置的。

通过classname属性指定验证类的类名,该类必须实现nc.sso.bs.ISSOAuthenticator接口。

public interface ISSOAuthenticator {
	public void authenticate(HttpServletRequest request) throws Exception;
}

默认的验证类为nc.sso.bs.DefaultSSOAuthenticator,该验证类将检查注册的URL的来源主机的ip地址是否在其所配置的合法ip地址的范围内,如果是,则允许注册,否则,将拒绝注册。

如果希望提供更加安全的验证处理,可以通过实现nc.sso.bs.ISSOAuthenticato接口并注册在配置文件中即可。

3.3、AbstractSSOAuthenticator

AbstractSSOAuthenticator类是一个实现了ISSOAuthenticato接口的抽象类,他提供了获取参数的方法String getValue(String key)和String[] getValues(String key)这些参数是在配置文件中进行配置的。所以在实现注册时的验证处理类时,如果需要能拥有获取配置文件中参数的功能,可以直接继承AbstractSSOAuthenticator类。

参数的配置提供两种标签:

1、字符串参数的配置标签

<param>:<param key=”key1” value=”value1”>

这类参数值可以通过String getValue(String key)方法获取

2、字符串数组参数的配置标签

<listParam>:
<listParam key="key">
<string>value1</string>
<string>value2</string>
<string>value3</string>
</listParam>

这类参数值可以通过String[] getValues(String key)方法获取。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测

多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测 目录 多维时序 | Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 Matlab实现CNN-RVM卷积神经网络结合相关向量机多变量时间序…

快准狠!在3D Slicer中,使用TotalSegmentator扩展可在1分钟内自动分割全身117个器官

本系列涵盖从 3D Slicer 医学图像查看器的基础使用到高级自动分割扩展程序的内容(从入门到高阶!),具体包括软件安装、基础使用教程,自动分割扩展(totalsegmentator, monai label)快速标注数据。 Tina姐:强烈建议做图像分割的宝宝们好好学习,跟着Tina姐涨姿势!本教程…

开关电源学习之Boost电路

如果我们需要给一个输入电压为5V的芯片供电&#xff0c;而我们只有一个3.3V的电源&#xff0c;那怎么办&#xff1f; 我们能不能把3.3V的电压升到5V&#xff1f; 一、电感的简介 而在升压的电路设计方案中&#xff0c;使用到一个重要的元器件&#xff1a;电感。 电感的特性…

44、WEB攻防——通用漏洞RCE代码执行多层面检测利用

文章目录 RCE分类&#xff1a; REC代码执行&#xff1a;引用脚本代码解析执行。例如&#xff0c;eval(phpinfo();)以php脚本解析phpinfo();。RCE命令执行&#xff1a;脚本调用操作系统命令。例如&#xff0c;system(ver)&#xff0c;命令执行能执行系统命令。 RCE漏洞对象&am…

C#中实现串口通讯和网口通讯(使用SerialPort和Socket类)

仅作自己学习使用 1 准备部份 串口通讯需要两个调试软件commix和Virtual Serial Port Driver&#xff0c;分别用于监视串口和创造虚拟串口。网口通讯需要一个网口调试助手&#xff0c;网络上有很多资源&#xff0c;我在这里采用的是微软商店中的TCP/UDP网络调试助手&#xff0…

ubuntu下修改hosts读写权限

ubuntu下修改hosts文件的操作&#xff1a; 由于需要在hosts文件下添加ip地址信息&#xff0c;但是初始情况下系统该文件为只读权限无法修改&#xff0c;具体操作如下所示&#xff1b; 1.cd到系统etc目录下&#xff0c;执行如下命令,此时会提示输入密码&#xff0c;直接输入回…

python28-Python的运算符之三目运算符

Python可通过if语句来实现三目运算符的功能&#xff0c;因此可以近似地把这种if语句当成三目运算符。作为三目运算符的f语句的语法格式如下 True_statements if expression else False_statements 三目运算符的规则是:先对逻辑表达式expression求值&#xff0c;如果逻辑表达式…

Java实现数据可视化的智慧河南大屏 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 数据模块 A4.2 数据模块 B4.3 数据模块 C4.4 数据模块 D4.5 数据模块 E 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的数据可视化的智慧河南大屏&#xff0c;包含了GDP、…

学习好并用好大模型

大模型是个好东西&#xff0c;学好并用好益处多多~ 1. 运用大模型服务我们的工作 运用大模型服务于工作&#xff0c;可以从以下几个方面着手&#xff1a; 知识管理与检索&#xff1a; 利用大模型强大的自然语言处理能力&#xff0c;建立企业内部的知识库系统。员工可以通过提问…

python flask 魔术方法

魔术方法作用_init_对象的初始化方法_class_返回对象所属的类_module_返回类所在的模块_mro_返回类的调用顺序&#xff0c;可以找到其父类&#xff08;用于找父类&#xff09;_base_获取类的直接父类&#xff08;用于找父类&#xff09;_bases_获取父类的元组&#xff0c;按它们…

Flask 入门6:模板继承

1. 一个网站中&#xff0c;大部分网页的模块是重复的&#xff0c;比如顶部的导航栏&#xff0c;底部的备案信息。如果在每个页面中都重复的去写这些代码&#xff0c;会让项目变得臃肿&#xff0c;提高后期的维护成本。比较好的做法是&#xff0c;通过模板继承&#xff0c;把一…

MCU+SFU视频会议一体化,视频监控,指挥调度(AR远程协助)媒体中心解决方案。

视频互动应用已经是政务和协同办公必备系统&#xff0c;早期的分模块&#xff0c;分散的视频应该不能满足业务需要&#xff0c;需要把视频监控&#xff0c;会议&#xff0c;录存一体把视频资源整合起来&#xff0c;根据客户需求&#xff0c;需要能够多方视频互动&#xff0c;直…

Spring Batch 批处理框架适配达梦数据库,实现从文件批量读取写入数据库(完整教程)

效果展示(达梦数据库): 技术简介: Spring Batch 是一个基于 Spring 的批处理框架,用于开发和执行大规模、高性能、可靠的批处理应用程序。它提供了丰富的功能和组件,用于处理复杂的批处理任务,例如大数据ETL(Extract-Transform-Load)、数据清洗、数据迁移、报表生成…

EV1527协议应用

EV1527协议应用 EV1527 帧结构解码原理实现代码 EV1527 帧结构 EV1527 每帧数据由同步码和 24 位的数据码组成&#xff0c;数据码又分为地址码&#xff08;20 位&#xff09;和按键码&#xff08;4 位&#xff09;。 以 433Mhz EV1527 遥控器为例&#xff0c;遥控波形如下。 …

TOP100 二叉树(二)

7.108. 将有序数组转换为二叉搜索树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树的高度差的绝对值不超过 1 」的二叉树。 示例 1&#xff1a; 输入…

闲聊电脑(6)装个 Windows(二)

闲聊电脑&#xff08;6&#xff09;装个 Windows&#xff08;二&#xff09; 夜深人静&#xff0c;万籁俱寂&#xff0c;老郭趴在电脑桌上打盹&#xff0c;桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭&#xff1a;冰箱大哥&#xff0c;上次说的镜像文件到底长啥样…

【华为 ICT HCIA eNSP 习题汇总】——题目集13

1、以下在项目规划阶段中需要完成的工作是&#xff08;&#xff09;。 A、确定技术方案 B、了解项目背景 C、选择网络产品 D、规划 IP 地址 考点&#xff1a;网络规划与设计 解析&#xff1a;&#xff08;B&#xff09; 确定技术方案是在网络规划的设计阶段完成的工作&#xff…

Anaconda的安装及其配置

一、简介 Anaconda是一个开源的包、环境管理器&#xff0c;主要具有以下功能和特点&#xff1a; 提供conda包管理工具&#xff1a;可以方便地创建、管理和分享Python环境&#xff0c;用户可以根据自己的需要创建不同的环境&#xff0c;每个环境都可以拥有自己的Python版本、库…

c#cad 创建-直线(五)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 这段代码是用于在AutoCAD中创建一条直线。首先获取当前活动文档和数据库的引用&#xff0c;然后创建一个编辑器对象用于提示用户输入。接下来&#xff0c;在一个事务中获取模型空间的块表记录&#xff0c;并定义直线的长度…

【Git】06 常用场景

文章目录 前言一、场景11.1 删除分支1.2 修改message信息1.2.1 最新一次commit的message1.2.2 过去commit的message 1.3 合并commit1.3.1 多个连续commit合并1.3.2 不连续commit合并 二、场景22.1 比较暂存区和HEAD所含文件的差异2.2 比较工作区和暂存区所含文件的差异2.3 将暂…
最新文章