/************************************************************ * * @packageName : io.company.localhost.controller.common * @fileName : UserController.java * @author : 조인제 * @date : 24.12.06 * @description : * * =========================================================== * DATE AUTHOR NOTE * ----------------------------------------------------------- * 24.12.06 조인제 최초 생성 * 24.01.17 박지윤 Register 합침 * *************************************************************/ package io.company.localhost.controller.common; import io.company.localhost.common.annotation.Admin; import io.company.localhost.common.annotation.Guest; import io.company.localhost.common.annotation.Member; import io.company.localhost.common.annotation.ParameterCheck; import io.company.localhost.common.annotation.ReqMap; import io.company.localhost.common.dto.ApiResponse; import io.company.localhost.common.dto.MapDto; import io.company.localhost.service.NetmemberService; import io.company.localhost.service.commoncodService; import io.company.localhost.utils.AuthUtil; import io.company.localhost.utils.SessionListener; import io.company.localhost.vo.MemberVo; import jakarta.servlet.http.Cookie; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.RememberMeAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolderStrategy; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.util.HashMap; import java.util.List; import java.util.Map; import static org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY; @Slf4j @RestController @RequestMapping("/api/user") @RequiredArgsConstructor public class UserController { private final commoncodService commoncodservice; private final NetmemberService netmemberservice; /** * 사용 가능 색상 조회 * * @return ApiResponse> * */ @ParameterCheck @GetMapping("/color") public ApiResponse> selectColorList(String type) { List ColorList = commoncodservice.selectColorList(type); return ApiResponse.ok(ColorList); } /** * MBTI 목록 조회 * * @return ApiResponse> * */ @ParameterCheck @GetMapping("/mbti") public ApiResponse> selectMbtiList() { List MbtiList = commoncodservice.selectMbtiList(); return ApiResponse.ok(MbtiList); } /** * 비밀번호 힌트 목록 조회 * * @return ApiResponse> * */ @ParameterCheck @GetMapping("/pwhint") public ApiResponse> selectPwhintList() { List PwhintList = commoncodservice.selectPwhintList(); return ApiResponse.ok(PwhintList); } /** * 회원가입 * * @param profile * @param map * @return ApiResponse */ @PostMapping("/join") public ApiResponse register(@RequestParam("memberPrf") MultipartFile memberPrf, @ReqMap MapDto map) { int member = netmemberservice.register(memberPrf, map); return ApiResponse.ok(member); } /** * 아이디 중복 체크 * * @param memberIds * @return ApiResponse * */ @GetMapping("/checkId") public ApiResponse selectCheckId(@RequestParam String memberIds) { boolean isDuplicate = netmemberservice.selectCheckId(memberIds); return ApiResponse.ok(!isDuplicate); } /** * 로그인 여부 체크 * * @return ApiResponse */ @GetMapping("/isLogin") public ApiResponse checkLogin() { boolean isLoggedIn = AuthUtil.isLoggedIn(); return ApiResponse.ok(isLoggedIn); } /** * 비밀번호 재설정 member 체크 * * @param map * @return ApiResponse * */ @PostMapping("/pwReset") public ApiResponse selectPwReset(@ReqMap MapDto map) { boolean isPwReset = netmemberservice.selectPwReset(map); return ApiResponse.ok(isPwReset); } /** * 기존 비밀번호 체크 * * @param map * @return ApiResponse */ @PostMapping("/checkPassword") public ApiResponse selectPassword(@ReqMap MapDto map) { boolean isNewPassword = netmemberservice.selectPassword(map); return ApiResponse.ok(isNewPassword); } /** * 비밀번호 재설정 * * @param map * @return ApiResponse * */ @PatchMapping("/pwNew") public ApiResponse updatePassword(@ReqMap MapDto map) { boolean isPwNew = netmemberservice.updatePassword(map); return ApiResponse.ok(isPwNew); } // security 인증 체크 @GetMapping("userInfo") public ApiResponse getUserInfo(@AuthenticationPrincipal MemberVo memberVo) { SecurityContextHolderStrategy contextHolderStrategy = SecurityContextHolder.getContextHolderStrategy(); log.info(">> contextHolderStrategy : {}", contextHolderStrategy); SecurityContext context = contextHolderStrategy.getContext(); log.info(">> context : {}", context); Authentication authentication = context.getAuthentication(); log.info(">> authentication : {}", authentication); log.info(">> memberVo : {}", memberVo); MemberVo user = AuthUtil.getUser(); log.info(">> AuthUtil : {}", user); return ApiResponse.ok(memberVo); } // 유저 세션 체크 @GetMapping(value = "check") public ApiResponse check() { Map sessions = SessionListener.getSessions(); Map sessionData = new HashMap<>(); for (Map.Entry entry : sessions.entrySet()) { String sessionId = entry.getKey(); HttpSession session = entry.getValue(); Object principal = session.getAttribute("SPRING_SECURITY_CONTEXT"); sessionData.put(sessionId, principal); } return ApiResponse.ok(sessionData); } // rememberMe 확인용 @GetMapping(value = "rememberCheck") public ApiResponse rememberCheck(HttpServletRequest request) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); boolean remember = false; if (authentication instanceof RememberMeAuthenticationToken) { remember = true; } // 쿠키 확인 Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY.equals(cookie.getName())) { log.debug("Remember-Me cookie found: {}", cookie.getValue()); remember = true; } } } else { log.debug("No cookies found"); } return ApiResponse.ok(remember); } // 로그아웃 @Guest @GetMapping("/logout") public ApiResponse logout(HttpServletRequest request, HttpServletResponse response) { String returnMessage = "Successfully logged out"; Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null) { new SecurityContextLogoutHandler().logout(request, response, authentication); // Remember-Me 쿠키 삭제 Cookie rememberMeCookie = new Cookie(SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY, null); rememberMeCookie.setPath("/"); rememberMeCookie.setMaxAge(0); rememberMeCookie.setHttpOnly(true); rememberMeCookie.setSecure(request.isSecure()); response.addCookie(rememberMeCookie); } else { returnMessage = "Failed to log out"; } return ApiResponse.ok(returnMessage); } /** * 사원 목록 전체 조회 * * * */ @ParameterCheck @GetMapping("/allUserList") public ApiResponse getallUserList() { List allUserList = netmemberservice.getallUserList(); MemberVo user = AuthUtil.getUser(); MapDto outData = new MapDto(); outData.put("allUserList", allUserList); outData.put("user", user); return ApiResponse.ok(outData); } @Guest @GetMapping("get1") public ApiResponse getAuthTest1() { return ApiResponse.ok(AuthUtil.getUser()); } @Member @GetMapping("get2") public ApiResponse getAuthTest2() { return ApiResponse.ok(AuthUtil.getUser()); } @Admin @GetMapping("get3") public ApiResponse getAuthTest3() { return ApiResponse.ok(AuthUtil.getUser()); } }