用友NC6x单点登录实现——跳转到浏览器或Uclient

一、实现方案说明
1、主要步骤:
外部系统实现单点登录NC6x,在外部系统进行登录验证,直接通过用户名访问NC,主要有下面几个步骤:
(1)使用用户名注册,获取注册码Key,请求url格式:

http://host:port/service/ssoRegServlet?userCode=usercode&busiCenter=001

通过用户名参数请求该url,nc服务端会返回ssoKey值,请求参数还可以跟其他参数,如下:
userCode:指定用户编码,该参数必须提供,不能省略;

ssoKey:指定用户登录信息的键值,并在登录时提供该值,要求唯一,如果没有提供该值,NC会生成一个ssoKey并在返回的Servlet流中输出该值。

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

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

langCode:指定登录的雨中,可以忽略,默认为中文。

(2)单点登录NC系统访问url基本格式为:

登录IE端:
http://host:port/loginnc.jsp?ssoKey=key

登录UClient端:
uclient://start/http://host:port/?ssoKey=key&uiloader=nc.login.sso.ui.SSOLoader

               其中:url中的key就是第1步中获得的ssoKey值

(3)配置外部单点登录nc的信任ip:

配置文件位置:&{NCHOME}\ierp\sf\ssoConfig.xml

标签中添加信任ip

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

(4)替换文件和增加文件

替换 ${nchome}\webapps\nc_web\login.jsp

替换${nchome}\webapps\nc_web\WEB-INF\jsp\ncapplet.jsp

增加${nchome}\webapps\nc_web\loginnc.jsp, 如果单点登录要求外部系统只通过用户名一次握手登录需要增加该文件,如果外部系统两次握手登录NC,则通过longin.jsp和ssoRegServlet即可实现登录逻辑,无需增加loginnc.jsp

主要逻辑图如下:
在这里插入图片描述

文件下载:

login.jsp

ncapplet.jsp

loginnc.jsp

<%@ page language="java" import="java.util.*" pageEncoding="GB18030"%>
<%@ page import="java.net.HttpURLConnection,java.net.URL,java.net.MalformedURLException,java.io.IOException,java.io.BufferedReader,java.io.InputStreamReader"%> 
 
<script language="JavaScript">
var scheme = "<%=request.getScheme()%>"; //传输协议
var servername = "<%=request.getServerName()%>"; //NC主机地址
var serverport = "<%=request.getServerPort()%>"; //NC主机端口
//var usercode = "<%=request.getHeader("oam_remote_user")%>";//当前登录用户 NC中需存在该编码
var usercode = "<%=request.getParameter("userCode")%>";//用户编码
var account = "<%=request.getParameter("account")%>";//账套编码
var ncurloo= "uclient://start/" + scheme + "://" + servername + ":" + serverport ;
var ncurl = scheme + "://" + servername + ":" + serverport ;
var xmlHttp;
var key;	
 
window.onload = getMHsskey;
 
//访问门户网站的验证码地址。得到验证码   
function getMHsskey(){
        if (null != usercode) { // 已登录
            //做登录处理
	   openNC();
        } else {
            // 用户未登录
           alert("用户名为空,请确认");
        }
}
 //单点登录NC系统的方法
function openNC(){
	//获取ssokey的值
	doRequestUsingGET(usercode);
	//单点登录NC,方法延迟1s执行,等待异步请求注册ssokey的返回值
	setTimeout(doRequestLogin,1000);
	
}
//在NC中注册单点登录所使用的sskey注册码
function doRequestUsingGET(usercode){  	 
    createXMLHttpRequest();   
	
    var queryString=ncurl+"/service/ssoRegServlet?busiCenter="+account+"&userCode="+usercode;	
 
    xmlHttp.onreadystatechange = handleStateChange;   	
    xmlHttp.open("GET",queryString,false);  	
    xmlHttp.send(null);	
}
 
//将得到的NC注册码赋值到变量key,用于单点登录NC系统使用
function handleStateChange(){ 	
    if(xmlHttp.readyState==4){   
      if(xmlHttp.status==200){          
       	key=xmlHttp.responseText;
      }else{
		//key=xmlHttp.responseText;
	  }
    }   
 }
 
//创建ajax异步请求对象
function createXMLHttpRequest(){   
	var code = usercode;
     if(window.ActiveXObject){   
      	xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");   
     }else if(window.XMLHttpRequest){   
      	xmlHttp=new XMLHttpRequest();   
     }   
   }
 
 
 
//单点登录NC
function doRequestLogin(){
	var url = ncurloo+"/?ssoKey="+key+"&uiloader=nc.login.sso.ui.SSOLoader";
	
	location.href = url;
	setTimeout(closeWindow,1000);//唤起UClient后关闭浏览器页签
}
 
function closeWindow(){
	var browser = navigator.userAgent.indexOf("Firefox");
	if(browser>-1){
		location.href = "about:blank";
	}else{
		window.opener = null;
        window.open("", "_self", "");
        window.close();
	}
}
</script>
<html>
<head>
<meta http-equiv="pragma" content="no-cache"> 
<meta http-equiv="cache-control" content="no-cache"> 
<meta http-equiv="expires" content="0">  
</head>
<body>
</body>
</html>

原文链接:https://blog.csdn.net/qq_32553271/article/details/72764331

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSO(Single sign-on)即单点登录技术。它是指在多个子系统的大型应用中,用户在子系统之间进行切换时,不需要每次都重新输入用户的身份信息,从而做到一处认证,整个应用系统都能有效识别。单点登录技术的系统集成功能为当前企事业单位尤其是大型多子系统企业系统集成提供了完美的解决方案。它使得这些原有系统能够合理的集成起来,对外提供统一的界面风格和唯一的登录入口。单点登录只是一种功能概念,并没有对具体的实现方式进行定义和限制。NC-Portal的单点登录方案,就是SSO技术的一种实现方式。 NC-Portal的SSO方案是基于凭证的思想设计。对于NC-Portal集成的每个第三方系统都有一个制作凭证的页面,该页面用于当前登录的portal用户输入对应的第三方系统的用户信息,在正常情况下,该制作凭证的页面最多出现一次。当用户输入的第三方系统登录信息进行验证后,会自动在portal系统的数据库中建立一对凭证槽和凭证信息,这对信息记录了portal用户在特定的portal布局和特定的portlet下,与该第三方系统的身份对应关系。当该用户之后登录portal并进入被集成第三方系统时,portal系统负责获取之前成功建立的对应第三方系统身份信息,并用该身份信息进行第三方系统的身份认证。这一切的操作对当前登录用户来说都是透明的,他们看到的是没有输入任何身份信息而以正确的身份进入了第三方系统。另外,在用户每次登录第三方系统时,都会根据第三方系统的要求进行身份认证,因此这个登录过程是安全的。 对于NC-Portal来说,对Web系统的集成提供了完善的支持和解决,对Web系统的集成,目前有大小之分。集成一个单独的系统NC、IUFO、BO、OA系统采用单独的一个布局存放(当然,该布局也是由一个portlet组成),这些Web系统称为“大”系统。另外,还存在一些集成第三方系统的“小”portlet,如NC待办事务Portlet、NC报表Portlet、IUFO报表Portlet等,这些是以“小”Portlet的形式出现的。他们主要提供一些对集成系统的辅助功能,如对NC待办事务的提取、对IUFO报表信息的提取,这两种方式功能侧重点略有不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值