一、实现方案说明
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
<string></string>标签中添加信任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
主要逻辑图如下:
文件下载:
<%@ 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>