GPKI 인증서 로그인 기능을 구현하려고 하는 경우에는 EgovLoginController.java를 다음과 같이 변경한다.

  • 로그인 화면 처리 부분을 다음과 같이 수정한다.
public String loginUsrView(@ModelAttribute("loginVO") LoginVO loginVO,
    HttpServletRequest request,
    HttpServletResponse response,
    ModelMap model) 
    throws Exception {
	// # GPKI 인증을 처리하는 경우 
	GPKIHttpServletResponse gpkiresponse = null;
	GPKIHttpServletRequest gpkirequest = null;
 
	try{
 
		gpkiresponse=new GPKIHttpServletResponse(response); 
		gpkirequest= new GPKIHttpServletRequest(request);
		gpkiresponse.setRequest(gpkirequest);
		model.addAttribute("challenge", gpkiresponse.getChallenge());
		return "cmm/uat/uia/EgovLoginUsr";
 
	}catch(Exception e){
		return "cmm/egovError";
	}
}
  • 인증서 로그인 처리 부분을 다음과 같이 수정한다.
public String actionCrtfctLogin(@ModelAttribute("loginVO") LoginVO loginVO, 
    HttpServletRequest request,
    HttpServletResponse response,
    ModelMap model)
    throws Exception {
    	// # GPKI 인증을 처리하는 경우 
    	// 접속IP
    	String userIp = EgovClntInfo.getClntIP(request);
 
    	// 1. GPKI 인증
    	GPKIHttpServletResponse gpkiresponse = null;
	GPKIHttpServletRequest gpkirequest = null;
	String dn = "";
	try{
		gpkiresponse = new GPKIHttpServletResponse(response);
		gpkirequest = new GPKIHttpServletRequest(request);
		gpkiresponse.setRequest(gpkirequest);
		X509Certificate cert = null; 
 
		byte[] signData = null;
		byte[] privatekey_random = null;
		String signType = "";
		String queryString = "";
 
		cert = gpkirequest.getSignerCert();
		dn = cert.getSubjectDN();
 
		java.math.BigInteger b = cert.getSerialNumber();
		b.toString();
		int message_type =  gpkirequest.getRequestMessageType();
		if( message_type == gpkirequest.ENCRYPTED_SIGNDATA || 
		    message_type == gpkirequest.LOGIN_ENVELOP_SIGN_DATA ||
		    message_type == gpkirequest.ENVELOP_SIGNDATA || 
		    message_type == gpkirequest.SIGNED_DATA){
		    signData = gpkirequest.getSignedData();
		    if(privatekey_random != null) {
			privatekey_random   = gpkirequest.getSignerRValue();
		    }
		    signType = gpkirequest.getSignType();
		}       
		queryString = gpkirequest.getQueryString();
	}catch(Exception e){
		return "cmm/egovError";
	}
 
	// 2. 업무사용자 테이블에서 dn값으로 사용자의 ID, PW를 조회하여
	// 이를 일반로그인 형태로 인증하도록 함
	if (dn != null && !dn.equals("")) {
 
		loginVO.setDn(dn);
		LoginVO resultVO = loginService.actionCrtfctLogin(loginVO);
		if (resultVO != null && resultVO.getId() != null && 
		    !resultVO.getId().equals("")) {	
		    // 3. spring security 연동
		    return "redirect:/j_spring_security_check?j_username=" +
		           resultVO.getUserSe() + resultVO.getId() + 
			   "&j_password=" + resultVO.getUniqId();
		} else {
		    model.addAttribute("message", 
		                       egovMessageSource.getMessage("fail.common.login"));
		    return "cmm/uat/uia/EgovLoginUsr";
		}
	} else {
		model.addAttribute("message", 
		                   egovMessageSource.getMessage("fail.common.login"));
		return "cmm/uat/uia/EgovLoginUsr";
	}
}
반응형

+ Recent posts