비밀번호 재설정
비밀번호 변경이 필요합니다
보안을 위해 현재 비밀번호를 재설정해야 합니다.
비밀번호 재설정 해주세요.
비밀번호는 특수문자, 영문, 숫자를 포함해야 합니다.* * Copyright 2008-2009 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package egovframework.user.login.web; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import java.util.Date; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.web.bind.annotation.RequestBody; import org.egovframe.rte.fdl.property.EgovPropertyService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springmodules.validation.commons.DefaultBeanValidator; import egovframework.common.service.JwtTokenProvider; import egovframework.common.service.JwtTokenVO; import egovframework.user.login.service.AuthKakaoVO; import egovframework.user.login.service.AuthNaverVO; import egovframework.user.login.service.EmailUtil; import egovframework.user.login.service.LoginService; import egovframework.user.login.service.LoginVO; import egovframework.user.login.service.RelateSiteVO; import egovframework.user.login.service.SchoolVO; import egovframework.user.login.service.UserVO; import egovframework.user.mypage.service.MypageService; // EPKI import javax.servlet.http.HttpSession; import java.math.BigInteger; import com.epki.api.EpkiApi; import com.epki.cert.X509Certificate; import com.epki.conf.ServerConf; import com.epki.util.Base64; import com.epki.exception.EpkiException; import org.json.simple.JSONObject; import org.json.simple.JSONValue; import java.io.IOException; import com.epki.crypto.*; import com.epki.cms.EnvelopedData; import com.epki.cms.SignedData; import com.epki.cert.CertValidator; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import org.springframework.beans.factory.annotation.Autowired; import egovframework.user.utl.epk.service.Aes; /** * @Class Name : LoginController.java * @Description : Login Controller Class * @Modification Information @ 수정일 수정자 수정내용 @ --------- --------- * ------------------------------- @ 2022-10-31 최초생성 * * @author 개발팀 * @since 2022-10-31 * @version 1.0 * @see * * Copyright (C) by KICE All right reserved. */ @RestController @RequestMapping(value = "/api") public class LoginController { public final int SUCCESS = 1; public final int FAIL = 0; private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class); /** LoginService */ @Resource(name = "loginService") private LoginService loginService; /** EgovPropertyService */ @Resource(name = "propertiesService") protected EgovPropertyService propertiesService; /** Validator */ @Resource(name = "beanValidator") protected DefaultBeanValidator beanValidator; /** EgovPropertyService */ @Resource(name = "jwtTokenProvider") protected JwtTokenProvider jwtTokenProvider; @Resource(name = "emailUtil") protected EmailUtil emailUtil; /** MypageService */ @Resource(name = "mypageService") private MypageService mypageService; @Autowired protected Aes aes; /** * 학교 목록을 조회한다. * * @param school - 조회할 정보가 담긴 KucuDefaultVO * @param model * @return "BbsList" * @exception Exception */ @GetMapping(value = "/schools") public Map
selectSchoolList(SchoolVO vo) throws Exception { Map
rMap = new HashMap<>(); if(vo.getSchoolSeq()!=0) { Map
school = new HashMap<>(); school = loginService.selectSchool(vo.getSchoolSeq()); if(school.get("schoolType").equals("E")) { vo.setCityCode((String) school.get("cityCode")); } } List> schoolList = loginService.selectSchoolList(vo); rMap.put("searchList", schoolList); return rMap; } /** * 학교 목록을 조회한다. * * @param school - 조회할 정보가 담긴 KucuDefaultVO * @param model * @return "BbsList" * @exception Exception */ @GetMapping(value = "/school/{schoolSeq}") public Map
selectSchool(@PathVariable("schoolSeq") Integer schoolSeq) throws Exception { Map
rMap = new HashMap<>(); return loginService.selectSchool(schoolSeq); } /** * 아이디 중복을 확인한다. * * @param school - 조회할 정보가 담긴 KucuDefaultVO * @param model * @return "BbsList" * @exception Exception */ @GetMapping(value = "/id/{id}/duplicated") public Boolean duplicateId(@PathVariable("id") String id) throws Exception { Boolean rBoolean = false; rBoolean = loginService.existUserById(id); return rBoolean; } /** * 이메일 중복을 확인한다. * * @param school - 조회할 정보가 담긴 KucuDefaultVO * @param model * @return "BbsList" * @exception Exception */ @GetMapping(value = "/email/{email}/duplicated") public Boolean duplicateEmail(@PathVariable("email") String email) throws Exception { Boolean rBoolean = false; rBoolean = loginService.existUserByEmail(email); return rBoolean; } /** * 연계 사이트 로그인 정보 확인한다. * * @param vo - 로그인할 id, password 정보 * @return Boolean * @exception Exception */ @GetMapping(value = "/relate/basecamp") public Boolean getRelateSiteLoginBaseCampCheck(RelateSiteVO vo) throws Exception { Boolean rBoolean = false; rBoolean = loginService.getRelateSiteLoginBaseCampCheck(vo); return rBoolean; } /** * 사용자를 등록한다. * * @param vo - 로그인할 id, password 정보 * @return Boolean * @exception Exception */ @PostMapping(value = "/user") public Boolean setUser(HttpServletRequest request, @RequestBody UserVO vo) throws Exception { if("TCH".equals(vo.getJoinDt())) { HttpSession m_Session = request.getSession(); String sessionID = m_Session.getId(); String epkiObject = m_Session.getAttribute(sessionID).toString(); Map
resultMap = convertStringToMap(epkiObject); String bserial = (String) resultMap.get("bserial"); vo.setEpkiAuth(bserial); } return loginService.registerUser(vo); } /** * 사용자를 등록한다. * * @param vo - 로그인할 id, password 정보 * @return Boolean * @exception Exception */ @PostMapping(value = "/user/excel") public Boolean setUserExcel(@RequestBody List
> requestList) throws Exception { return loginService.registerUserExcel(requestList); } /** * 로그인한다. * * @param loginVO - 조회할 정보가 담긴 KucuDefaultVO * @return JwtTokenVO * @exception Exception */ @PostMapping(value = "/userLogin") public JwtTokenVO selectLoginList(HttpServletRequest request, @RequestBody LoginVO vo) throws Exception { return loginService.loginCheck(request, vo); } /** * 로그인한다. * * @param loginVO - 조회할 정보가 담긴 KucuDefaultVO * @return JwtTokenVO * @exception Exception */ @PostMapping(value = "/snsConnection/kakao") public boolean getAuthFromKakao(@RequestBody AuthKakaoVO vo) throws Exception { vo.setId(loginService.getAuthFromKakao(vo)); return loginService.setConnectionKakao(vo); } /** * 로그인한다. * * @param loginVO - 조회할 정보가 담긴 KucuDefaultVO * @return JwtTokenVO * @exception Exception */ @PostMapping(value = "/login/kakao") public JwtTokenVO getLoginFromKakao(HttpServletRequest request, @RequestBody AuthKakaoVO vo) throws Exception { vo.setId(loginService.getLoginAuthFromKakao(vo)); return loginService.getLoginFromKakao(request, vo); } /** * 로그인한다. * * @param loginVO - 조회할 정보가 담긴 KucuDefaultVO * @return JwtTokenVO * @exception Exception */ @PostMapping(value = "/snsConnection/naver") public boolean getAuthFromNaver(@RequestBody AuthNaverVO vo) throws Exception { vo.setId(loginService.getAuthFromNaver(vo)); return loginService.setConnectionNaver(vo); } /** * 로그인한다. * * @param loginVO - 조회할 정보가 담긴 KucuDefaultVO * @return JwtTokenVO * @exception Exception */ @PostMapping(value = "/login/naver") public JwtTokenVO getLoginFromNaver(HttpServletRequest request, @RequestBody AuthNaverVO vo) throws Exception { vo.setId(loginService.getLoginAuthFromNaver(vo)); return loginService.getLoginFromNaver(request, vo); } /** * 로그인한다. * * @param loginVO - 조회할 정보가 담긴 KucuDefaultVO * @return JwtTokenVO * @exception Exception */ @GetMapping(value = "/user/{userSeq}/agree") public Boolean getUserAgree(HttpServletRequest request, @PathVariable("userSeq") Integer userSeq) throws Exception { if(userSeq != Integer.parseInt(jwtTokenProvider.getUserSeqFromToken(jwtTokenProvider.getJwt().toString()))) { throw new IllegalArgumentException("사용자 정보가 맞지 않습니다. 관리자에 문의하세요."); } return loginService.getUserAgree(userSeq); } /** * 로그인한다. * * @param loginVO - 조회할 정보가 담긴 KucuDefaultVO * @return JwtTokenVO * @exception Exception */ @PatchMapping(value = "/user/{userSeq}/agree") public Boolean setUserAgree(HttpServletRequest request, @PathVariable("userSeq") Integer userSeq) throws Exception { if(userSeq != Integer.parseInt(jwtTokenProvider.getUserSeqFromToken(jwtTokenProvider.getJwt().toString()))) { throw new IllegalArgumentException("사용자 정보가 맞지 않습니다. 관리자에 문의하세요."); } return loginService.setUserAgree(userSeq); } /** * 아이디 찾기를 위한 정보를 확인한다. * * @param userVO - 조회할 정보가 담긴 userVO * @return boolean * @exception Exception */ @PostMapping(value = "/find/findId") public Map
findId(@RequestBody UserVO vo) throws Exception { Map
rMap = new HashMap
(); boolean result = false; String msg = ""; //이메일과 이름을 확인한다. boolean rBoolean = false; rBoolean = loginService.checkEmailForFindId(vo); if(rBoolean) { Map
uMap = loginService.getUserForFindId(vo); vo.setUserId(uMap.get("userId").toString()); //아이디를 메일로 발송한다. Map
sendMap = emailUtil.sendFindIdEmail(vo); if(Integer.parseInt(sendMap.get("resultCode").toString())== 200) { result = true; } } else { msg = "해당하는 회원 정보를 찾지 못하였습니다."; } rMap.put("result", result); rMap.put("msg", msg); return rMap; } /** * 비밀번호 찾기를 위한 정보를 확인한다. * * @param userVO - 조회할 정보가 담긴 userVO * @return boolean * @exception Exception */ @PostMapping(value = "/find/findPw") public Map
findPw(@RequestBody UserVO vo) throws Exception { Map
rMap = new HashMap
(); boolean result = false; String msg = ""; //이메일과 이름, 아이디를 확인한다. boolean rBoolean = false; rBoolean = loginService.checkEmailForFindPw(vo); if(rBoolean) { //임시 비밀번호 생성 및 변경 String tempPw = makeTempPw(); vo.setPassword(tempPw); Map
uMap = loginService.getUserForFindId(vo); vo.setUserSeq(Integer.parseInt(uMap.get("userSeq").toString())); vo.setUserId(uMap.get("userId").toString()); boolean isUpdated = loginService.updateTempPw(vo); //임시 비밀번호를 메일로 발송한다. if(isUpdated) { Map
sendMap = emailUtil.sendFindPwEmail(vo, tempPw); if(Integer.parseInt(sendMap.get("resultCode").toString())== 200) { result = true; } } else { result = false; msg = "오류가 발생하여 메일을 발송하지 못하였습니다."; } } else { msg = "해당하는 회원 정보를 찾지 못하였습니다."; } rMap.put("result", result); rMap.put("msg", msg); return rMap; } private String makeTempPw() { String result = ""; String tempPw = UUID.randomUUID().toString().replace("-", ""); result = tempPw.substring(0, 10); return result; } @PostMapping(value = "/check") public int checkUserExistence(@RequestBody Map
rMap) throws Exception { return loginService.checkUserExistence(rMap); } /** * EPKI 인증 서비스 * * @param * @return Map
* @exception Exception */ @PostMapping(value="/epki/login") public Map
loginEPKI(HttpServletRequest request, @RequestBody Map
requestBody){ Map
result = new HashMap<>(); HttpSession m_Session = request.getSession(); String sessionID = m_Session.getId(); String loginRequestData = (String) requestBody.get("loginData"); String subjectDn = ""; String issuerDn = ""; BigInteger bserial = null; String strAlgID = ""; String strSessionKey = ""; String strSessionIV = ""; try { EpkiApi.initApp(); Base64 base64 = new Base64(); byte[] bsessionKey = null; byte[] bsessionIV = null; byte[] bencryptedData = null; byte[] bdecryptData = null; // 서버 설정 객체를 생성합니다. ServerConf serverConf = new ServerConf(); // 서버 인증서 정보를 가져옵니다. X509Certificate cert = serverConf.getServerCert(ServerConf.CERT_TYPE_KM); PrivateKey priKey = serverConf.getServerPriKey(ServerConf.CERT_TYPE_KM); // 채널보안 로그인 동시수행 메시지에서 채널보안 키 정보를 읽어옵니다. EnvelopedData envloped = new EnvelopedData(); byte[] developedData = envloped.develop(base64.decode(loginRequestData), cert, priKey); // 채널보안에서 사용할 키를 가져옵니다. SecretKey secretKey = envloped.getSecretKey(); SignedData signedData = new SignedData(); // 채널보안 로그인 동시수행 메시지에서 로그인 요청 메시지를 읽어옵니다. signedData.verify(base64.decode(new String(developedData))); byte[] reqLoginBytes = signedData.getMessage(); // JSON Parse Start JSONObject reqJsonData = (JSONObject) JSONValue.parse(new String(reqLoginBytes)); // 로그인 요청 메시지에서 R값을 추출합니다. String rNumber = (String) reqJsonData.get("RN"); String vid = (String) reqJsonData.get("VID"); // 인증 요청 메시지로부터 클라이언트 인증서를 획득합니다. X509Certificate loginCert = signedData.getSignerCert(0); if (vid != null) { // 요청자 VID 정보가 포함될 경우 신원확인을 합니다. loginCert.verifyVID(base64.decode(rNumber), vid); } // 인증서를 검증하기 위해 CertValidator 객체를 생성합니다. CertValidator validator = new CertValidator(); validator.setValidateCertPathOption(CertValidator.CERT_VERIFY_FULLPATH); String scvpUrl = "http://scvp.epki.go.kr:8080"; // SCVP 검증서버 IP:PORT validator.setValidateRevokeOption(CertValidator.REVOKE_CHECK_SCVP); validator.setSCVPUrl(scvpUrl); validator.setServerSignCert(serverConf.getServerCert(ServerConf.CERT_TYPE_SIGN), serverConf.getServerPriKey(ServerConf.CERT_TYPE_SIGN)); // 클라이언트 인증서를 검증합니다. validator.validate(CertValidator.CERT_TYPE_SIGN, loginCert); strAlgID = secretKey.getKeyAlg(); bsessionKey = secretKey.getKey(); bsessionIV = secretKey.getIV(); // 세션키 Base64 인코딩 Base64 encoder = new Base64(); strSessionKey = encoder.encode(bsessionKey); strSessionIV = encoder.encode(bsessionIV); m_Session.setAttribute("sessionKey", strSessionKey); m_Session.setAttribute("sessionIV", strSessionIV); m_Session.setAttribute("algorithm", strAlgID); // 요청자 인증서 정보 획득 subjectDn = loginCert.getSubjectName(); issuerDn = loginCert.getIssuerName(); bserial = loginCert.getSerialNumber(); if(subjectDn.indexOf("교육부") < 0 && subjectDn.indexOf("교육청") < 0 && subjectDn.indexOf("테스트") < 0) { result.put("result_code", "414"); result.put("result_msg", "fail"); } else { Map
epkiData = new HashMap<>(); epkiData.put("bserial", bserial.toString()); epkiData.put("subjectDn", subjectDn); m_Session.setAttribute("epkiObject", epkiData); result.put("result_code", "200"); result.put("result_msg", "ok"); result.put("result_data", subjectDn); } } catch (EpkiException e) { result.put("result_code", "411"); result.put("result_msg", "fail"); } catch (Exception e) { // 인증서 검증 실패 if(e.toString().indexOf("CertificateExpiredException") > 0){ result.put("result_code", "412"); } // 폐기된 인증서 if(e.toString().indexOf("CertificateRevokedException") > 0){ result.put("result_code", "413"); } result.put("result_msg", "fail"); } return result; } /** * 사용자를 등록한다. * * @param vo - 로그인할 id, password 정보 * @return Boolean * @exception Exception */ @PostMapping(value = "/user/student/check") public Boolean checkUserStudentId(@RequestBody Map
requestBody) throws Exception { String userId = String.valueOf(requestBody.get("userId")); String checkId = loginService.getUserSeqByUserId(userId); if(checkId == null){ return true; } else { return false; } } /** * EPKI 공인인증서 정보 확인 * * * @param * @return Map
* @exception Exception */ @PostMapping(value="/epki/find/subjectDn") public Map
findEpkiName(HttpServletRequest request, @RequestBody Map
requestBody){ Map
result = new HashMap<>(); HttpSession m_Session = request.getSession(); String sessionID = m_Session.getId(); Map
epki = null; try { String epkiObject = m_Session.getAttribute("epkiObject").toString(); Map
resultMap = convertStringToMap(epkiObject); String subjectDn = (String) resultMap.get("subjectDn"); result.put("result_code", "200"); result.put("result_msg", "ok"); result.put("result_data", subjectDn); } catch (Exception e) { System.out.println(e.toString()); } return result; } public static Map
convertStringToMap(String data) { Map
resultMap = new HashMap<>(); // 문자열의 시작과 끝의 중괄호 제거 data = data.trim().substring(1, data.length() - 1); // 쉼표로 구분된 키-값 쌍으로 분리 String[] keyValuePairs = data.split(",\\s*"); for (String pair : keyValuePairs) { // 등호로 키와 값 분리 String[] keyValue = pair.split("=", 2); if (keyValue.length == 2) { String key = keyValue[0].trim(); String value = keyValue[1].trim(); resultMap.put(key, value); // 결과 맵에 추가 } } return resultMap; } /** * EPKI 공인인증서 정보 확인 * * * @param * @return Map
* @exception Exception */ @PostMapping(value="/epki/update") public Map
userEpkiAndSchoolUpdate(HttpServletRequest request, UserVO vo, @RequestBody Map
requestBody){ Map
result = new HashMap<>(); int schoolSeq = (Integer) requestBody.get("schoolSeq"); int userSeq = (Integer) requestBody.get("userSeq"); HttpSession m_Session = request.getSession(); String sessionID = m_Session.getId(); String epkiObject = m_Session.getAttribute(sessionID).toString(); Map
resultMap = convertStringToMap(epkiObject); String bserial = (String) resultMap.get("bserial"); System.out.println("/bserial"); // int userSeq = Integer.parseInt(schoolSeq); Map
user = mypageService.getMyInfo(userSeq); System.out.println(user); vo.setGrade(user.get("grade") != null ? user.get("grade").toString() : null); // null 체크 추가 vo.setNo(user.get("no") != null ? Integer.parseInt(user.get("no").toString()) : 0); // null 체크 및 변환 vo.setUpdUser(userSeq); vo.setSchoolSeq(schoolSeq); vo.setEpkiAuth(bserial); boolean update = mypageService.patchUser(userSeq, vo); if(update){ result.put("result_code", "200"); } else { result.put("result_code", "400"); } return result; } @PostMapping(value="/consent") public Map
updateConsentDt(UserVO vo, @RequestBody Map
requestBody) throws Exception { Map
result = new HashMap<>(); String stSeq = requestBody.get("userSeq").toString(); int userSeq = Integer.parseInt(stSeq); vo.setUserSeq(userSeq); if(loginService.updateConsentDt(vo)){ LocalDateTime now = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String formattedDateTime = now.format(formatter); result.put("result_code", "200"); result.put("result_data", formattedDateTime); } else { result.put("result_code", "400"); }; return result; } } r> * 특수문자: ! @ # $ % ^ & * ( )
변경 비밀번호
비밀번호 확인
변경
로그인
회원가입
마이페이지
님
내 정보
로그아웃
마이페이지
대시보드
학생 관리
학생-학부모 매칭
학생그룹 관리
추천 학습자료
검사이력 관리
검사이력 집계
내 정보
인기검색어
학교급 선택
과목 선택
초기화
검색(
0
건)
기초학력 지원 이해하기
기초학력
지원이란?
기초학력 보장
선도ㆍ시범 학교
두드림 학교
(Do-Dream)
학습종합
클리닉센터
인기 학습자료
2022-04-03
59
공지사항
보도자료
알림판