NC5.X系列单点登录

先摘录一段单点登录的定义,来自百度百科。

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

单点登录的基本流程:用户发起单点登陆请求----->>通过请求信息获取用户编号usercode------>>利用usercode在系统中注册登录信息------->>利用注册的信息单点登录到NC系统

以下类请根据具体项目需求开放和注释部分代码

一、登录请求处理类

/**
 * NC单点登录Servlet类
 */
public class NCLoginServlet extends HttpServlet {
   
	/** 字段描述 */
	private static final long serialVersionUID = 1L;

	// 传输协议
	private String scheme = null;

	// NC主机地址
	private String serverName = null;

	// NC主机端口
	private int serverPort = 80;

	// 传递过来的用户账号
	private String usercode = null;

	// 屏幕宽度
	private String width = null;

	// 屏幕高度
	private String height = null;

	public static String getFromBASE64(String s) {
   
		if (s == null)
			return null;
		BASE64Decoder decoder = new BASE64Decoder();
		try {
   
			byte[] b = decoder.decodeBuffer(s);
			return new String(b);
		} catch (Exception e) {
   
			return null;
		}
	}

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
		try {
   

			// 接收前台传递过来的信息
			scheme = request.getScheme(); // 传输协议
			serverName = request.getServerName(); // NC主机地址
			serverPort = request.getServerPort(); // NC主机端口
			width = request.getParameter("width"); // 屏幕宽度
			height = request.getParameter("height");// 屏幕高度
			NcWebTools ncweb = new NcWebTools();
			// 取得传递过来的域用户信息,解密
			//usercode = NcWebTools.SSOUnicodeToString(request.getParameter("ssoid"));
			usercode = request.getParameter("ssoid");
			//CA二次认证
//			if(!ncweb.isVerifyPass(usercode)){
   
//				String url = scheme + "://" + serverName + ":" + serverPort + "/ncsso/error/error106.jsp";
//				response.sendRedirect(url); // 重定向至错误页面
//				return;
//			}
			// 检查用户是否存在于NC系统中
			String username = ncweb.isExistInNC(usercode);
			if (username == null) {
   
				String url = scheme + "://" + serverName + ":" + serverPort + "/error.jsp";
				response.sendRedirect(url); // 重定向至错误页面
				return;
			}
			// 检查用户是否已分配权限
//			if (!ncweb.isExistRole(usercode)) {
   
//				String url = scheme + "://" + serverName + ":" + serverPort + "/ncsso/error/error103.jsp";
//				response.sendRedirect(url); // 重定向至错误页面
//				return;
//			}
			// 重定向至NC主界面
			sendToNC(response, ncweb);

		} catch (Exception ex) {
   
			ex.printStackTrace();
			throw new ServletException(ex.getMessage());
		}
	}

	@Override
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
   
		this.doGet(request, response);
	}

	/**
	 * 
	 * <P>
	 * 重定向至NC主界面
	 * </P>
	 * 
	 * @param response
	 * @throws Exception
	 */
	private void sendToNC(HttpServletResponse response, NcWebTools ncweb) throws Exception {
   

		// 随机生成一个key
		String randomKey = IDMaker.makeID(20);

		// 组装注册请求url
		String ssurl = scheme + "://" + serverName + ":" + serverPort + "/service/RegisterServlet?key=" + randomKey + "&language=simpchn" // 语言
				+ "&usercode=" + usercode // 用户编码
				+ "&width=" + width // 屏幕宽度
				+ "&height=" + height; // 屏幕高度

		// 获取登录公司
		String pk_corp = ncweb.getCorpByUsercode(usercode);

		if (pk_corp != null && !"".equals(pk_corp)) {
   
			ssurl += "&pkcorp=" + pk_corp;
		}
		Logger.debug(ssurl);
		ncweb.connect(ssurl); // 注册

		// 拼装NC单点登录URL
		String url = scheme + "://" + serverName + ":" + serverPort + "/login.jsp?key=" + randomKey + "&width=" + width // 屏幕宽度
				+ "&height=" + height; // 屏幕高度;
//		String url = "Uclient://start/"+scheme + "://" + serverName + ":" + serverPort+"/?ssoKey="+ randomKey/*+"&uiloader=nc.ui.sm.login.Loader3"*/;

		// 重定向到指定的地址
//		response.sendRedirect(url);
		PrintWriter w = response.getWriter();
		w.print(url);
		//w.print("<html><head><script>window.location='"+url+"';</script></head><body></body></html>");
		return;

	}
}

二、各项辅助类

  1. IDMaker 用于生成注册信息(key)
/**
 * key生成器
 */
public class IDMaker {
   
	private final static String CODES = "0123456789abcdefghijklmnopqrstuvwxyz+";

	private final static String DIGIT_CODES = "0123456789+";

	private final static String CHAR_CODES = "abcdefghijklmnopqrstuvwxyz+";

	// 组成ID基本元素的数量
	public static final int ID_ELEMENT_COUNT = 36;

	public static final int TYPE_ALL = 0;

	public static final int TYPE_CHAR = 1;

	public static final int TYPE_DIGIT = 2;

	/**
	 * 返回长度为idLen的编码
	 * 
	 * @return java.lang.String
	 * @param idLen
	 *            int
	 */
	public final static String makeID(int idLen, int idType) {
   
		if (idType == TYPE_CHAR) {
   
			return makeCharID(idLen);
		}
		if (idType == TYPE_DIGIT) {
   
			return makeDigitID(idLen);
		}
		return makeID(idLen);
	}

	/**
	 * 返回长度为idLen的编码
	 * 
	 * @return java.lang.String
	 * @param idLen
	 *            int
	 */
	private final static String makeDigitID(int idLen) {
   
		if (idLen < 1 || idLen > 64) {
   
			return null;
		}

		String id = null;

		if (id == null)
			id = "";
		int n;
		StringBuffer sb = new StringBuffer(id);
		for (int i = 0; i < idLen; i++) {
   
			n = (int) (java.lang.Math.random() * 10);
			sb.append(DIGIT_CODES.substring(n, n + 1));
		}
		return sb.toString();
	}

	/**
	 * 返回长度为idLen的编码
	 * 
	 * @return java.lang.String
	 * @param idLen
	 *            int
	 */
	private final static String makeCharID(int idLen) {
   
		if (idLen < 1 || idLen > 64) {
   
			return null;
		}

		String id = null;

		if (id == null)
			id = "";
		int n;
		StringBuffer sb = new StringBuffer(id);
		for (int i = 0; i < idLen; i++) {
   
			n = (int)
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
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报表信息的提取,这两种方式功能侧重点略有不同。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值