diff --git a/src/main/java/goormthon/team28/startup_valley/StartupValleyApplication.java b/src/main/java/goormthon/team28/startup_valley/StartupValleyApplication.java index 94e7840..f2e33c0 100644 --- a/src/main/java/goormthon/team28/startup_valley/StartupValleyApplication.java +++ b/src/main/java/goormthon/team28/startup_valley/StartupValleyApplication.java @@ -33,15 +33,15 @@ public static void main(String[] args) { .setMemberCachePolicy(MemberCachePolicy.ALL) .setActivity(Activity.playing("START UP VALLEY")) .addEventListeners(new DiscordListener( - context.getBean(UserService.class), - context.getBean(TeamService.class), - context.getBean(MemberService.class), - context.getBean(QuestionService.class), - context.getBean(AnswerService.class), - context.getBean(ScrumService.class), - context.getBean(WorkService.class), - context.getBean(GptService.class), - context.getBean(ReviewService.class) + context.getBean(UserService.class), + context.getBean(TeamService.class), + context.getBean(MemberService.class), + context.getBean(QuestionService.class), + context.getBean(AnswerService.class), + context.getBean(ScrumService.class), + context.getBean(WorkService.class), + context.getBean(GptService.class), + context.getBean(ReviewService.class) ) ) .build(); @@ -49,7 +49,7 @@ public static void main(String[] args) { jda.updateCommands().addCommands( Commands.slash("팀원업데이트", "웹에 사용자들과 현재 진행하는 프로젝트를 연동해요 ! "), Commands.slash("파트입력하기", "프로젝트에서 맡은 본인의 역할을 입력해 주세요 !") - .addOption(OptionType.STRING, "part", "본인의 역할을 'BACKEND', 'FRONTEND', 'FULLSTACK', 'PM', 'DESIGN' 중에서 입력해주세요 !", true), + .addOption(OptionType.STRING, "part", "본인의 역할을 'BACKEND', 'FRONTEND', 'FULLSTACK', 'PM', 'DESIGN' 중에서 입력해주세요 !", true), Commands.slash("질문하기", "궁금한 점을 질문해봐요 ! ") .addOption(OptionType.USER, "receiver", "질문 받을 사람을 선택해주세요 !", true) .addOption(OptionType.STRING, "question_content", "질문 내용을 작성해주세요 !", true), @@ -60,7 +60,7 @@ public static void main(String[] args) { Commands.slash("업무시작", "오늘의 업무 시간을 시작해요 !"), Commands.slash("업무종료", "오늘의 업무를 종료해요 ! 업무 내용과 함께 기입해주세요 ~ !") .addOption(OptionType.STRING, "work_list", "오늘의 업무 내용을 '; '을 통해서 구분하여 작성해주세요 !! ", true), - Commands.slash("스크럼종료", "지금까지의 업무들로 하나의 스크럼을 생성해요 ! "), + Commands.slash("백로그종료", "지금까지의 업무들로 하나의 백로그를 생성해요 ! "), Commands.slash("프로젝트종료", "프로젝트의 리더가 결정 할 수 있어요 ! 종료하고 동료평가 단계로 넘어가요 ! "), Commands.slash("서버최신화", "디스코드의 서버 이름과 이미지의 변경점을 웹에 적용해요 ! "), Commands.slash("동료평가작성", "개발이 마무리 되셨나요? 프로젝트 종료 이후에 팀원들 사이에 동료평가를 작성할 수 있습니다 !") diff --git a/src/main/java/goormthon/team28/startup_valley/discord/listener/DiscordListener.java b/src/main/java/goormthon/team28/startup_valley/discord/listener/DiscordListener.java index 29a1fa6..d474c9c 100644 --- a/src/main/java/goormthon/team28/startup_valley/discord/listener/DiscordListener.java +++ b/src/main/java/goormthon/team28/startup_valley/discord/listener/DiscordListener.java @@ -207,11 +207,11 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { .setEphemeral(true).queue(); break; - case "스크럼종료": + case "백로그종료": Optional optionalScrum = getProcessingScrum(event, event.getUser().getName()); // 종료할 스크럼이 없는 경우 if (optionalScrum.isEmpty()){ - event.reply("진행 했던 업무가 없어서 스크럼을 종료할 수 없습니다 ㅠㅠ.. 업무를 시작하여 데이터를 만들어 주세요 !!! ") + event.reply("진행 했던 업무가 없어서 백로그를 종료할 수 없습니다 ㅠㅠ.. 업무를 시작하여 데이터를 만들어 주세요 !!! ") .setEphemeral(true).queue(); return; } @@ -220,7 +220,7 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { // 업무가 아직 종료되지 않는 것이 있는 경우 Optional optionWork = getMyProcessingWork(event); if (optionWork.isPresent()){ - event.reply("진행 중인 업무가 존재합니다 ㅠㅠ 업무를 종료한 뒤, 스크럼을 종료하여 주세요 ! ") + event.reply("진행 중인 업무가 존재합니다 ㅠㅠ 업무를 종료한 뒤, 백로그를 종료하여 주세요 ! ") .setEphemeral(true).queue(); return ; } @@ -242,7 +242,7 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { .setEphemeral(true).queue(); return ; } - event.reply("하나의 스크럼이 마무리 됐어요 ~! 앞으로의 스크럼도 화이팅입니다 ~ !\n") + event.reply("하나의 백로그가 마무리 됐어요 ~! 앞으로의 백로그도 화이팅입니다 ~ !\n") .setEphemeral(true).queue(); break; @@ -300,7 +300,7 @@ public void onSlashCommandInteraction(SlashCommandInteractionEvent event) { event.reply("이미 동료평가를 작성한 팀원입니다 ! 다른 분의 동료평가를 작성해주세요 !").setEphemeral(true).queue(); return ; } - + // 본인에게 작성할 수 없음 if (sendMember.getId().equals(receiveMember.getId())){ event.reply("본인에게 동료평가를 작성할 수 없습니다 ! 다른 분의 동료평가를 작성해주세요 !").setEphemeral(true).queue(); diff --git a/src/main/java/goormthon/team28/startup_valley/security/handler/exception/CustomAuthenticationEntryPointHandler.java b/src/main/java/goormthon/team28/startup_valley/security/handler/exception/CustomAuthenticationEntryPointHandler.java index 8e257e6..05feb0f 100644 --- a/src/main/java/goormthon/team28/startup_valley/security/handler/exception/CustomAuthenticationEntryPointHandler.java +++ b/src/main/java/goormthon/team28/startup_valley/security/handler/exception/CustomAuthenticationEntryPointHandler.java @@ -2,7 +2,6 @@ import goormthon.team28.startup_valley.exception.ErrorCode; import goormthon.team28.startup_valley.security.info.AuthenticationResponse; -import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.security.core.AuthenticationException; @@ -13,11 +12,13 @@ @Component public class CustomAuthenticationEntryPointHandler implements AuthenticationEntryPoint { @Override - public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { // filter 단에서 발생한 에러 핸들링 ErrorCode errorCode = (ErrorCode) request.getAttribute("exception"); - if (errorCode == null) + if (errorCode == null) { AuthenticationResponse.makeFailureResponse(response, ErrorCode.WRONG_ENTRY_POINT); + return ; + } AuthenticationResponse.makeFailureResponse(response, errorCode); } } diff --git a/src/main/java/goormthon/team28/startup_valley/security/provider/JwtAuthenticationProvider.java b/src/main/java/goormthon/team28/startup_valley/security/provider/JwtAuthenticationProvider.java index 0936662..517624d 100644 --- a/src/main/java/goormthon/team28/startup_valley/security/provider/JwtAuthenticationProvider.java +++ b/src/main/java/goormthon/team28/startup_valley/security/provider/JwtAuthenticationProvider.java @@ -9,12 +9,15 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Component; @Slf4j @Component @RequiredArgsConstructor public class JwtAuthenticationProvider implements AuthenticationProvider { + private final BCryptPasswordEncoder bCryptPasswordEncoder; private final CustomUserDetailService customUserDetailService; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { @@ -22,15 +25,20 @@ public Authentication authenticate(Authentication authentication) throws Authent if (authentication.getPrincipal().getClass().equals(String.class)){ // form login 요청인 경우 log.info("로그인 로직 인증 과정"); - return authOfBeforeLogin(authentication.getPrincipal().toString()); + return authOfLogin(authentication); } else { // 로그인 이후의 경우에 String이 아닌 복합 정보가 들어오는 경우 log.info("로그인한 사용자 검증 과정"); return authOfAfterLogin((JwtUserInfo) authentication.getPrincipal()); } } - private Authentication authOfBeforeLogin(String serialId){ - UserPrincipal userPrincipal = customUserDetailService.loadUserByUsername(serialId); + private Authentication authOfLogin(Authentication authentication){ + // DB에 저장된 실제 데이터 + UserPrincipal userPrincipal = customUserDetailService.loadUserByUsername(authentication.getPrincipal().toString()); + + // 비밀번호 검증 로직 + if (!bCryptPasswordEncoder.matches(authentication.getCredentials().toString(), userPrincipal.getPassword())) + throw new UsernameNotFoundException("비밀번호가 일치하지 않습니다 ! "); return new UsernamePasswordAuthenticationToken(userPrincipal, null, userPrincipal.getAuthorities()); } private Authentication authOfAfterLogin(JwtUserInfo userInfo){