一、背景说明
湖南省政府互动(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)