JIS与湖南CA整合经验分享

朱治龙
2013-04-07 / 0 评论 / 0 阅读 / 正在检测是否收录...

一、背景说明

湖南省政府互动(JCAT)及相关应用(JCMS, TRSWCM等应用也有可能会进行整合)后期准备使用JIS统一登录入口,省政府目前使用的内容管理平台(TRSWCM)为安全着想,已全部采用CA登录的形式进行后台管理,本次整合主要是针对各部门原有的证书在本系统继续正常使用。
经过清明节两天假期时间对CA及JIS的学习和程序修改以及n次拷贝和n次重启tomcat不断及坚持不懈的调试,今天终于把省政府这边的JIS跟湖南CA一块整合成功了.在此先感谢韩洋的指导。怕隔夜以后就没那么清晰 ,所以趁现在还清楚就先跟大家分享一下。

二、实现思路

在login.jsp中新增代码获取CA登录的开关,如果该开关为开状态则进行CA登录验证,如果为关状态则继续原有的登录。

修改merp_pub_user用户信息表,在该表中使用现有的vc_cardid字段存储CA编号信息,新增c_caname字段(CA证书绑定的用户姓名),c_caBandTime(存储绑定操作的系统时间),c_capwdStr(用于CA绑定时存储用户的明文密码,系统在登录时将密码的明文存储在了session中,而且在系统中发现在不少应用跳转时用到了,所以这里也就直接存储明文,便于跟系统原有登录相对接)
新增一个有关CA登录操作相关的类,在该方法中书写CA登录相关实现方法.

新增ca_login.jsp页面,在该页面中新增CA登录相关功能实现,原有的系统登录功能不变.
新增ca/ca_rem.jsp页面,该页面根据CA编号删除CA与系统的绑定关系.

三、相关代码

CALogin.java

 /**
     * 根据CA编号判断是否有用户存在
     * @param caId    CA编号
     * @return 如果该编号存在则返回true,否则返回false
     */
    public static boolean chkUserByCaId(String caId)
     /***
     * 
     * 根据用户名和CA编号将CA编号绑定到用户信息中
     * @param loginId 用户登录名称
     * @param caId     CA编号
     * @param strCAUserName    CA证书中的用户姓名
     * @param c_capwdStr    用户密码,第一次绑定时记录用户密码,在不少场合需要用到明文密码,故单独存储起来.
     * @return 是否绑定成功,绑定成功返回true,否则返回false
     */
    public static boolean updUserByCaId(String loginId,String caId,String strCAUserName,String c_capwdStr)
     /**
     * 根据CA编号获取用户基本信息
     * @param caId CA编号
     * @return 用户基本信息 
     */
    public static String[][] getUserInfoByCaId(String caId)
    /***
     * 通过CA编号取消掉CA跟统一登录的绑定关系.
     * @param caId
     * @return  节次关系是否成功
     */
    public static boolean removeCaRelationByCaId(String caId)

## ca_login.jsp

//CA证书相关数据获取
   Cookie[] cookies = request.getCookies();
   if(cookies == null)
       cookies = new Cookie[0];
   String name = "";
   String CA_NO = "";//CA编号
   String ca_LoginId="";//JIS系统用户名
   String ca_userPwd="";//JIS系统登录密码_明文
   boolean bandResult = false;//绑定结果
   boolean loginByCA =false;//判断用户进行CA绑定时,将CA编号跟账号绑定
   boolean isLoginByForm = false;//是否是提交表单访问本页面,主要用于JS判断,避免二次绑定提示对话框
   int nResult=0;
   for(int i = 0; i < cookies.length; i ++)
   {
       Cookie cookie = cookies[i];
       if("KOAL_CERT_SERIAL_NUMBER".equals(cookie.getName()))
           CA_NO = cookie.getValue();
       else
           continue;
   }
   if(CALogin.chkUserByCaId(CA_NO)){
       //后台存在用户,则获取用户相关信息并登录
       String[][] userInfo = CALogin.getUserInfoByCaId(CA_NO);
       if(userInfo!=null){
           ca_LoginId = userInfo[0][1];
           ca_userPwd = userInfo[0][2];
           loginByCA=true;
       }
       
   }
   //修改获取用户名密码的方式,如果不是从表单中提交的则获取CA中的用户名和密码信息
   String strUser = Convert.getParameter(request, "userid",ca_LoginId,true,true);
   String strPassword = Convert.getParameter(request, "userpassword",ca_userPwd);
//如果不是使用CA直接登录的,则进行CA跟系统用户的绑定
   if(loginByCA==false){
   bandResult = CALogin.updUserByCaId(strUser,CA_NO,strCAUserName,strPassword);
   }
//JS相关判断及提示.
var JS_CA_NO = "<%=CA_NO%>";
if("<%=isCa%>"=="false"){
var turnURL = "";
   if(window.location.href.indexOf("59.231.1")>0){
       turnURL = "http://59.231.1.222/jis/";
   }else{
       turnURL = "http://act.hunan.gov.cn/jis/"; 
   }
   window.location.href=turnURL+"login.jsp";
}
if(JS_CA_NO==""){
   alert("  \n  请插入证书并数据正确的CA密码登录  \n  ");
   var turnURL = "https://113.240.233.86:452/jis/";
   if(window.location.href.indexOf("59.231.1")>0){
       turnURL = "https://59.231.1.100:452/jis/";
   }else{
       turnURL = "https://113.240.233.86:452/jis/"; 
   }
   window.location.href=turnURL+"ca_login.jsp";
}
if("<%=CALogin.chkUserByCaId(CA_NO) %>"=="false"&&"<%=isLoginByForm%>"=="false"){
   alert("  \n  证书尚未绑定,请执行系统登录操作进行系统绑定  \n  ");
}
if("<%=bandResult%>"=="true"){
   alert("恭喜您,绑定成功!\n即将跳转到系统界面")
}

# 四、相关截图

五、实施收获

很多事情没有第一次做,本身就存在一种畏惧的意识,总感觉不知如何下手才好,经过本次实施,感觉很多方面的东西只要把思路理清了,技术实现都是很容易的事。

0

评论 (0)

取消