From a255674a66e8086a7056852bcf573aa2f4a404a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?lkd9125=28=EC=9D=B4=EA=B2=BD=EB=8F=84=29?= Date: Thu, 7 Dec 2023 11:41:05 +0900 Subject: [PATCH] =?UTF-8?q?jwt=ED=8C=A8=ED=82=A4=EC=A7=80=20=EC=B6=94?= =?UTF-8?q?=EC=84=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JwtAuthenticationController.java | 58 ++++++++++++++----- .../biz/api/acnt/jwt/service/JwtService.java | 33 +++++++---- .../pty/PtyCstmrQueryRepository.java | 34 +++++++++++ 3 files changed, 100 insertions(+), 25 deletions(-) diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java index 0cb758b0..45de1880 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/controller/JwtAuthenticationController.java @@ -41,20 +41,30 @@ public class JwtAuthenticationController { @Autowired private JwtService service; + /** + * 로그인 기능, + * JwtRqModel에 입력받은 회원아이디, 입력받은 회원 비밀번호로 인증처리를 함. + * @param authenticationRequest + * @return + * @throws Exception + */ @PostMapping(value = "/login") @ApiOperation(value = "로그인") @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") public ResponseEntity createAuthenticationToken(@RequestBody JwtRqModel authenticationRequest) throws Exception { + + // 로그인 프로세스 + Map resultMap = service.loginProcess(authenticationRequest); - Map resultMap = service.loginProcess(authenticationRequest); - - int loginError = (int) resultMap.get("loginError"); + int loginError = (int) resultMap.get("loginError"); + // loginError 은 1이 정상, - 값은 모두 로그인 실패임 if(loginError < 0) { String errorMessage = (String) resultMap.get("errorMessage"); + + // 로그인 실패시 로그인 실패한 사유를 반환함 return ResponseEntity.status(HttpStatus.OK) - .body(new ErrorResponse(errorMessage, loginError + "")); // 계정 사용하지 못함 }else { @@ -65,49 +75,70 @@ public class JwtAuthenticationController { } + /** + * 로그인 한 회원 정보, + * 회원고유번호[cstmrSno]로 조회를 함. + * @param cstmrSno + * @return + * @throws Exception + */ @GetMapping(value = "/profile/{cstmrSno}") @ApiOperation(value = "로그인한 회원의 정보") @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") @ApiImplicitParam(name = "cstmrSno",value = "고객일련번호", dataTypeClass = Integer.class) public ResponseEntity proflie(@PathVariable Integer cstmrSno) throws Exception{ - JwtProfileRsModel result = service.profile(cstmrSno); + JwtProfileRsModel result = service.profile(cstmrSno); // 회원고유번호로 회원정보를 가져오는 기능. if(result == null) { + // 반환받은 회원정보가 없을시 "의도적인" 예외코드를 반환해줌 return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT)); } return ResponseEntity.ok().body(new SuccessResponse(result)); } - + /** + * 회원의 인가정보 유효기간 종료시, + * 다시 인가정보[토큰]를 받는 기능 + * @param body + * @return + * @throws Exception + */ @PostMapping(value = "/refresh") @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") // public ResponseEntity refresh(@RequestParam("cstmrSno") int cstmrSno , @RequestParam("refreshToken") String refreshToken) throws Exception{ public ResponseEntity refresh(@RequestBody Map body) throws Exception{ - //입력값 검증 + // 회원고유번호[cstmrSno], 회원고유번호[cstmrSno]가 Integer타입인지, 인가정보를 다시받을 토큰값 [refreshToken] 입력값에 대한 검증처리 if(body.get("cstmrSno") == null || body.get("refreshToken") == null || !(body.get("cstmrSno") instanceof Integer)) { + // 검증이 되지 않으면 "의도적인" 예외코드를 반환해줌 return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.ER_PARAM)); } - + int cstmrSno = (int)body.get("cstmrSno"); String refreshToken = (String)body.get("refreshToken"); - - - - JwtRsModel result = service.findRefreshtoken(cstmrSno, refreshToken); + + // 재 인가토큰 발급 + JwtRsModel result = service.findRefreshtoken(cstmrSno, refreshToken); // JwtRsModel result = null; if(result ==null) { + // 토큰발행 실패 시 "의도적인" 예외코드를 반환해줌 return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT)); } return ResponseEntity.ok().body(new SuccessResponse(result)); } + /** + * 로그아웃 기능. + * @param cstmrSno + * @return + * @throws Exception + */ @GetMapping(value = "/logout/{cstmrSno}") @ApiOperation(value = "로그아웃 한 회원의 정보") @Tag(name = "JWT 토큰 이용", description = "JWT 토큰 관련 API") @@ -120,10 +151,11 @@ public class JwtAuthenticationController { // } // int cstmrSno = (int)body.get("cstmrSno"); - + // 로그아웃 할 프로세스 PtyCstmrBas bas = service.logoutProcess(cstmrSno); if(bas == null) { + // 로그아웃 프로세스 실패 시 "의도적인" 예외코드를 반환해줌 return ResponseEntity.status(HttpStatus.OK) .body(new ErrorResponse(RSErrorCode.DATA_NOTFOUNT)); } diff --git a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java index 8289528c..eb005f97 100644 --- a/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java +++ b/pav-server/src/main/java/com/palnet/biz/api/acnt/jwt/service/JwtService.java @@ -39,8 +39,7 @@ public class JwtService { private final JwtTokenUtil jwtTokenUtil; /** - * 로그인 처리 - * + * 로그인 처리하는 기능. * @param rq * @return */ @@ -78,8 +77,8 @@ public class JwtService { } } - - if (loginError < 0) { + //loginError 값이 - 인경우 에러 메세지와 함꼐 반환 + if (loginError < 0) { String errorMessage = ""; if (loginError == -100) { @@ -103,11 +102,13 @@ public class JwtService { return resultMap; - } else { + } else { //loginError 값이 + 값이라면 로긍니 성공 - String accessToken = jwtTokenUtil.generateToken(userDetails); + // 인증이후 인가할 정보 만듬. + String accessToken = jwtTokenUtil.generateToken(userDetails); String refreshToken = jwtTokenUtil.generateRefreshToken(userDetails); + // 반환할 객체 설정. JwtRsModel result = new JwtRsModel(); result.setAccessToken(accessToken); result.setRefreshToken(refreshToken); @@ -139,9 +140,18 @@ public class JwtService { } + /** + * 로그아웃 하는 기능. + * @param cstmrSno + * @return + * @throws Exception + */ public PtyCstmrBas logoutProcess(int cstmrSno) throws Exception { + // 회원의 정보를 받아옴 Optional optional = ptyCstmrBasRepository.findById(cstmrSno); + + // 회원의 인가정보를 만료시킴 if (optional.isPresent()) { PtyCstmrBas entity = optional.get(); entity.setRfrshToken(""); @@ -175,7 +185,7 @@ public class JwtService { } /** - * refresh Token 저장 처리 + * refresh Token 저장 처리 기능 * * @param cstmrSno * @param refreshToken @@ -197,8 +207,7 @@ public class JwtService { } /** - * 프로필 조회 - * + * 회원의 프로필을 조회하는 기능. * @param cstmrSno * @return * @throws Exception @@ -211,8 +220,7 @@ public class JwtService { } /** - * token 만료시 refresh 토큰으로 재검색 - * + * token 만료시 refresh 토큰으로 재검색 하는 기능. * @param cstmrSno * @param refreshToken * @return @@ -231,7 +239,8 @@ public class JwtService { Claims claims = jwtTokenUtil.getAllClaimsFromToken(refreshToken); Integer cstmrSnoByRefreshToken = claims.get("cstmrSno", Integer.class); if(cstmrSnoByRefreshToken != cstmrSno) return null; - + + // 인가 토큰 발행할수 있게 필요한 회원 정보들을 데이터베이스에서 조회함. JwtUserModel userDetails = query.findByIdForrefreshToken(cstmrSno); String createAccessToken = jwtTokenUtil.generateToken(userDetails); diff --git a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java index 92cac8e0..d9b89460 100644 --- a/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java +++ b/pav-server/src/main/java/com/palnet/biz/jpa/repository/pty/PtyCstmrQueryRepository.java @@ -279,6 +279,11 @@ public class PtyCstmrQueryRepository { } + /** + * cstmrSno 값으로 회원정보를 조회하는 SQL 기능. + * @param cstmrSno + * @return + */ public JwtProfileRsModel findUserProfile(int cstmrSno) { QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; QPtyCstmrDtl dtlEntity = QPtyCstmrDtl.ptyCstmrDtl; @@ -287,6 +292,22 @@ public class PtyCstmrQueryRepository { builder.and(basEntity.cstmrSno.eq(cstmrSno)); + /** + * 회원 고유번호[cstmrSno]로 회원의 기본 프로필정보를 데이터베이스에서 조회하는 SQL입니다. + * SELECT + * PCB.CSTMR_SNO, + * PCB.USER_ID , + * PCB.AUTH_ID , + * PCB.TRMNL_ID , + * PCB.SITE_CODE , + * PCB.USER_ID , + * PCB.CPT_AUTH_CODE , + * PCD.MEMBER_NAME + * FROM PTY_CSTMR_BAS PCB + * LEFT OUTER JOIN PTY_CSTMR_DTL PCD + * ON PCB.CSTMR_SNO = PCD.CSTMR_SNO + * WHERE PCB.CSTMR_SNO = #{cstmrSno} + */ JwtProfileRsModel model = query.select(Projections.bean(JwtProfileRsModel.class, basEntity.cstmrSno, basEntity.userId, @@ -333,11 +354,24 @@ public class PtyCstmrQueryRepository { } + /** + * cstmrSno로 기본 회원정보 받아오는 SQL과 + * 회원의 인가정보를 조회하여 받는 기능. + * @param cstmrSno + * @return + */ public JwtUserModel findByIdForrefreshToken(int cstmrSno) { QPtyCstmrBas basEntity = QPtyCstmrBas.ptyCstmrBas; BooleanBuilder builder = new BooleanBuilder(); builder.and(basEntity.cstmrSno.eq(cstmrSno)); + /** + * 회원 고유번호[cstmrSno]로 기본 회원정보 받아오는 SQL 기능입니다. + * SELECT + * * + * FROM PTY_CSTMR_BAS PCB + * WHERE PCB.CSTMR_SNO = #{cstmrSno} + */ PtyCstmrBas entity = query.select(basEntity) .from(basEntity) .where(builder)