비밀번호 재설정
비밀번호 변경이 필요합니다
보안을 위해 현재 비밀번호를 재설정해야 합니다.
비밀번호 재설정 해주세요.
비밀번호는 특수문자, 영문, 숫자를 포함해야 합니다.* * 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> * 특수문자: ! @ # $ % ^ & * ( )
변경 비밀번호
비밀번호 확인
변경
로그인
회원가입
마이페이지
님
내 정보
로그아웃
마이페이지
대시보드
학생 관리
학생-학부모 매칭
학생그룹 관리
추천 학습자료
검사이력 관리
검사이력 집계
내 정보
학교 찾기
검색
※ [등록] 버튼을 누르면, 가장 가까운 2월 1일 또는 8월 1일까지 변경이 불가합니다.
※ 회원가입 또는 전근 대상자가 아니라면 학교 정보 변경을 지양해주시기 바랍니다.
취소
등록
회원 가입
STEP1 가입 구분
STEP2 약관 동의
STEP3 정보 입력
STEP4 가입 완료
가입 구분
회원 구분에 따라 가입 절차에 차이가 있으니 반드시 본인에 해당하는 경우를 선택해 주시기 바랍니다.
학교 외 선생님
(기초학력지원센터 등)
학교 선생님
(초/중/고등학교 등)
학부모