inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

176만명의 커뮤니티!! 함께 토론해봐요.

oidc userinfo 확인 시 오류가 납니다.

미해결

스프링 시큐리티 OAuth2

안녕하세요. 강의 잘 보고 많은 부분 배워가고 있습니다. 강의 진행중 섹션 7의 OAuth2 로그인 구현 - Oauth 2.0 User 모델 소개(2)에서 뒷부분 oidc로 사용자 정보 조회하는 부분인데요. @GetMapping("/oidc") public OAuth2User oidc(String accessToken, String idToken) { ClientRegistration clientRegistration = clientRegistrationRepository.findByRegistrationId("keycloak"); OAuth2AccessToken oAuth2AccessToken = new OAuth2AccessToken(OAuth2AccessToken.TokenType.BEARER, accessToken, Instant.now(), Instant.MAX); Map<String, Object> idTokenClaims = new HashMap<>(); idTokenClaims.put(IdTokenClaimNames.ISS, "http://localhost:9091/realms/oauth2"); idTokenClaims.put(IdTokenClaimNames.SUB, "OIDC0"); idTokenClaims.put("preferred_username", "userpww"); OidcIdToken oidcIdToken = new OidcIdToken(idToken, Instant.now(), Instant.MAX, idTokenClaims); OidcUserRequest oAuth2UserRequest = new OidcUserRequest(clientRegistration, oAuth2AccessToken, oidcIdToken); OidcUserService oidcUserService = new OidcUserService(); OAuth2User oAuth2User = oidcUserService.loadUser(oAuth2UserRequest); return oAuth2User; } oidcUserService.loadUser(oAuth2UserRequest); 이 부분이 실행될 때 loadUser 메서드 내부의 if (!userInfo.getSubject().equals(userRequest.getIdToken().getSubject())) { OAuth2Error oauth2Error = new OAuth2Error(INVALID_USER_INFO_RESPONSE_ERROR_CODE); throw new OAuth2AuthenticationException(oauth2Error, oauth2Error.toString()); } 이 부분을 타면서 예외가 발생합니다. 어떤 부분을 확인해 봐야 할까요? userInfo의 sub와 userRequest의 sub가 달라서 그런걸까요? 읽어주셔서 감사합니다.

  • java
  • spring
  • spring-boot
  • oauth
aanicall 댓글 2 좋아요 0 조회수 335

하... 요류를 못찾겠습니다.

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

처음에는 BookService.class 작성시 userRepository의 orElseThrow가 불러와지지를 않아서 커뮤니티에 있는 다른분의 질문글에서 해답을 찾으려했는데 이걸 고치니 오류가 나타나는데 이 오류를 못찾겠습니다...강사님 살려주세요 Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2024-03-21 23:42:16.319 ERROR 4515 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'bookService' defined in file [/Users/jojun-yeong/Desktop/강의 자료/1월25/Java_Spring_Library_Application/library-app/out/production/classes/com/group/libraryapp/Service/book/BookService.class]: Unsatisfied dependency expressed through constructor parameter 1; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userLoanHistoryRepository' defined in com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean); Reason: Failed to create query for method public abstract boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean)! No property 'existByBookName' found for type 'UserLoanHistory'; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean)! No property 'existByBookName' found for type 'UserLoanHistory' at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.6.jar:2.7.6] at com.group.libraryapp.LibraryAppApplication.main(LibraryAppApplication.java:11) ~[classes/:na] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userLoanHistoryRepository' defined in com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean); Reason: Failed to create query for method public abstract boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean)! No property 'existByBookName' found for type 'UserLoanHistory'; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract boolean com.group.libraryapp.domain.user.loanhistory.UserLoanHistoryRepository.existByBookNameAndIsReturn(java.lang.String,boolean)! No property 'existByBookName' found for type 'UserLoanHistory' at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBean

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
준영 댓글 2 좋아요 0 조회수 287

안녕하세요 기선님 질문이있습니다..

미해결

스프링과 JPA 기반 웹 애플리케이션 개발

음.. 다시 쿼리를 보는데 @GetMapping("/events/{id}") public String getEvent(@CurrentUser Account account, @PathVariable String path, @PathVariable Long id, Model model) { model.addAttribute(account); model.addAttribute(eventRepository.findById(id).orElseThrow()); model.addAttribute(studyService.getStudy(path)); return "event/view"; } 이쪽을 탈때 쿼리가 총 3개 나가는건 이해 했는데 마지막에 enrollment 엔티티 가져올때 쿼리리는 왜 account 랑만 조인 하나요 ? 연관관계를 보면 Event도있는데 Event도 조인해야 하는거 아닌가요 ?? @ManToOne 관계라 Eager 모드 아닌가요 ??

  • java
  • spring
  • spring-boot
  • thymeleaf
  • jpa
H K 댓글 1 좋아요 0 조회수 274

빌드 관련 질문 있습니다.

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

윈도우로 하고 있는데 gradlew.bat 을 빌드 하면 해당 오류가 뜨고 있습니다. 세팅은 스프링 부터 3.2.3 자바 21 입니다. Gradle 세팅은 해당 입니다. 환경변수 확인 해봤는데 사용자 변수에는 JAVA_HOME 자체가 탐색도 안되는거 같습니다.

  • java
  • spring
  • mvc
  • spring-boot
ryu 댓글 1 좋아요 1 조회수 649

48초에 dependencies 문서보는 부분이 없네요

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 예전버전 인거같은데 웹사이트가 달라서 찾을수가 없네요

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
댓글 1 좋아요 0 조회수 229

컨슈머 테스트 중 쓰레드 슬립을 사용하지 않았는데 성공하는 이유가 뭘까요??

미해결

실습으로 배우는 선착순 이벤트 시스템

안녕하세요. 강의 잘 보고 있습니다. 저는 현재 kotlin, postgreSQL을 사용하고 있으며 M3 맥북 환경입니다 강의에서 쓰레드슬립 사용 전 테스트케이스가 실패하는걸 확인할 수 있는데, 왜 저는 테스트가 성공되는걸까요..?? 원래 실패 해야 정상인 상황일까요? 어떤 이유에서 성공하는지 감이 잘 안옵니다..

  • java
  • docker
  • spring-boot
  • kafka
  • redis
성현 댓글 2 좋아요 0 조회수 372

th:object에 대해 질문드립니다.

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

MVC2편에서 배웠던 것 같지만 헷갈리는 부분이 있어 질문드립니다. // ItemController /** * 상품 수정 */ @PostMapping("/items/{itemId}/edit") public String updateItem(@ModelAttribute("form") BookForm form) { // updateItemForm.html <form th:object="${form}" method="post"> th:object="${form}" 에서 괄호 안에 form을 참조하여 컨트롤러의 @ModelAttritube("form")을 했을 때 요청 파라미터를 바인딩해서 BookForm 객체에 넘겨준다고 이해했는데, @ModelAttritube("form1") 이런식으로 바꿔도 정상적으로 작동했습니다. 혹시 제가 놓친 부분이 있을까요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
Jaesang Yoon 댓글 1 좋아요 0 조회수 239

안녕하세요! 강의 내용을 바탕으로 응용해서 H2 데이터베이스에서 MySQL로 바꾸는 작업을 하고 있습니다!

해결됨

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

https://drive.google.com/file/d/1ZTyx0uvGjnTkhf1YH7t2espgi1Koaf0N/view?usp=sharing build.gradle이랑 application.properties diver 설정도 했는데 왜 부트가 꺼지는지 모르겠네요...ㅠ

  • java
  • spring
  • mvc
  • spring-boot
김남욱 댓글 2 좋아요 0 조회수 380

30장 코드수정하니 run오류가 납니다..

미해결

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

오류를 해석하려햇는데 book쪽에서 뭔가 오류인것같은데 수정하고 강사님 코드를 붙여넣어봐도 같은 오류가 나오네요.. 혹시 어떤오류인지 알 수 있을까요? Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2024-03-19 16:21:44.681 ERROR 42249 --- [ main] o.s.boot.SpringApplication : Application run failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.AnnotationException: No identifier specified for entity: com.group.libraryapp.domain.book.Book at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.24.jar:5.3.24] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:731) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:408) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303) ~[spring-boot-2.7.6.jar:2.7.6] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292) ~[spring-boot-2.7.6.jar:2.7.6] at com.group.libraryapp.LibraryAppApplication.main(LibraryAppApplication.java:11) ~[classes/:na] Caused by: org.hibernate.AnnotationException: No identifier specified for entity: com.group.libraryapp.domain.book.Book at org.hibernate.cfg.InheritanceState.determineDefaultAccessType(InheritanceState.java:266) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] at org.hibernate.cfg.InheritanceState.getElementsToProcess(InheritanceState.java:211) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] at org.hibernate.cfg.AnnotationBinder.bindClass(AnnotationBinder.java:772) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.processEntityHierarchies(AnnotationMetadataSourceProcessorImpl.java:225) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.processEntityHierarchies(MetadataBuildingProcess.java:239) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:282) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:1460) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1494) ~[hibernate-core-5.6.14.Final.jar:5.6.14.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.3.24.jar:5.3.24] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.3.24.jar:5.3.24] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409) ~[spring-orm-5.3.24.jar:5.3.24] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396) ~[spring-orm-5.3.24.jar:5.3.24] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.24.jar:5.3.24] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.24.jar:5.3.24] ... 16 common frames omitted 종료 코드 1(으)로 완료된 프로세스

  • java
  • spring
  • aws
  • mysql
  • spring-boot
  • jpa
준영 댓글 3 좋아요 0 조회수 416

챕터 8 카카오 토큰 받기 이후

미해결

코드로 배우는 React 19 with 스프링부트 API서버

카카오 토큰 받기 이후로 많은 오류가 한번에 떠서 질문 드립니다! 부트 서버에서도 member.service, impl에 콘솔 찍은것도 에러로 인해 안뜹니다 상황마다 500오류 400오류 grant value 오류 등이 계속 뜹니다 ㅜㅜ 부트 https://github.com/hyeonbin03/IntelliJHub 일단 부트 코드는 선생님 주셨던 파일 참고해서 Member Modify 기능까지 작성 완료 된 상태입니다 리엑트 https://github.com/hyeonbin03/WebStromHub 깃 주소 남겨드겠습니다 ㅠㅠ

  • react
  • spring-boot
  • jpa
  • jwt
  • redux-toolkit
양현빈 댓글 1 좋아요 0 조회수 430

@WebServlet 관련 질문 사항

미해결

스프링 부트 - 핵심 원리와 활용

서블릿 컨테이너 초기화2에서 설명하시기를 서블릿을 등록하는 방법 @WebServlet을 사용하는 방법 프로그래밍 방법 이렇게 두 가지가 있다고 말씀해주셨는데 2번 같은 경우에는 서블릿을 만들고 서블릿 컨테이너에 해당 서블릿을 올린다 라는 느낌으로 이해를 했습니다. 그런데 첫번째 방법 같은 경우에는 서블릿을 등록한다 라고만 해서 약간 이해가 되지 않습니다 제가 생각할때는 서블릿 컨테이너가 있어야 하고 서블릿이 등록이 되어야 하는데 2번째는 서블릿 컨테이너를 만들고 거기에 등록을 했으니까 되는건데 첫번째는 어떤 서블릿 컨테이너에 등록이 되는건가요?? 또한 @WebServlet이 여러개가 있다면 각각은 다른 서블릿 컨테이너에 등록되는건지 같은 서블릿 컨테이너에 등록 되는건지 궁금합니다

  • spring
  • spring-boot
  • prometheus
  • grafana
최성훈 댓글 1 좋아요 0 조회수 201

error , exception 이 잘 안됩니다.

미해결

스프링 시큐리티

강사님 소스와 똑같이 했는데도 안되는데요 .... 로그인 실패해도 에러 문구가 안뜹니다. 디버깅하면 Controller 값이 null 로 들어오는데 왜그런걸까요 ?? security 설정에 /login?* 설정도 해줬습니다. @Controller public class LoginController { // 에러가 있을때만 선택적으로 받는다. @RequestMapping(value={"/login"}) public String login(@RequestParam(value = "error", required = false ) String error, @RequestParam(value = "exception", required = false ) String exception, Model model){ model.addAttribute("error",error); model.addAttribute("exception",exception); return "login"; } @GetMapping("/logout") public String logout(HttpServletRequest request, HttpServletResponse response) { Authentication authentiation = SecurityContextHolder. getContext ().getAuthentication(); if (authentiation != null ) { new SecurityContextLogoutHandler().logout(request, response, authentiation); } return "redirect:/login"; } } package com.eazybytes.springsecsection3.security .handler; import java.io.IOException; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.InsufficientAuthenticationException; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; import org.springframework.stereotype.Component; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; // 인증 검증시 실패할때 인증 예외 발생 @Component public class CustomAuthenticationFailureHandle extends SimpleUrlAuthenticationFailureHandler { @Override public void onAuthenticationFailure( final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException exception) throws IOException, ServletException { String errorMessage = "Invalid Username or Password"; if (exception instanceof BadCredentialsException) { errorMessage = "Invalid Username or Password"; } else if (exception instanceof InsufficientAuthenticationException) { errorMessage = "Invalid Secret"; } setDefaultFailureUrl("/login?error=true&exception=" + errorMessage); super .onAuthenticationFailure(request, response, exception); } } package com.eazybytes.springsecsection3.security .config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.security.servlet.PathRequest; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationDetailsSource; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer; import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import com.eazybytes.springsecsection3.security.provider.CustomAuthenticationProvider; import com.eazybytes.springsecsection3.security.service.CustomUserDetailsService; import jakarta.servlet.DispatcherType; @Configuration public class SecurityConfig { @Autowired private AuthenticationSuccessHandler customerauthenticationSuccessHandler; // 인증 성공후 핸들링 처리 @Autowired private AuthenticationFailureHandler authenticationFailureHandlerl; // 인증 실패후 핸들링 처리 @Autowired private AuthenticationDetailsSource authenticationDetailsSource; // FormWebAuthenticationDetails 을 security 가 사용할 수 있도록 등록 @Autowired private CustomUserDetailsService userDetailsService; // 개발자가 만든 userDetailsService 를 사용 protected void configure (AuthenticationManagerBuilder auth) throws Exception{ // CustomAuthenticationProvider 를 seruciry 가 사용할 수 있도록 등록 auth.authenticationProvider(authenticationProvider()); } @Bean public AuthenticationProvider authenticationProvider() { return new CustomAuthenticationProvider(); } @Bean SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception { http.csrf(AbstractHttpConfigurer::disable); http.authorizeHttpRequests((auth) -> auth .dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll() .requestMatchers("/","/users","/users/login/**, /login*").permitAll() /* /login* /login?error=true&exception 접근 허용 */ .requestMatchers("/mypage").hasRole("USER") .requestMatchers("/message").hasRole("MANAGER") .requestMatchers("/config").hasRole("ADMIN") .anyRequest().authenticated()); http.formLogin((form) -> form.loginPage("/login") .loginProcessingUrl("/login_proc") .defaultSuccessUrl("/") .authenticationDetailsSource(authenticationDetailsSource) .successHandler(customerauthenticationSuccessHandler ) // 인증이 성공한 후 핸들링 처리 .failureHandler(authenticationFailureHandlerl) // 인증이 실패후 후 핸들링 처리 .permitAll() ); return http.build(); } @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } @Bean public WebSecurityCustomizer webSecurityCustomizer() { // 정적 리소스 spring security 대상에서 제외 return (web) -> web .ignoring() .requestMatchers( PathRequest.toStaticResources().atCommonLocations() ); } } --------------------- <!DOCTYPE html> <html xmlns:th= "http://www.thymeleaf.org" > <head th:replace= "layout/header::userHead" ></head> <body> <div th:replace= "layout/top::header" ></div> <div class= "container text-center" > <div class= "login-form d-flex justify-content-center" > <div class= "col-sm-5" style="margin-top: 30px ;"> <div class= "panel" > <p>아이디와 비밀번호를 입력해주세요</p> </div> <div th:if= "${param.error}" class= "form-group" > <span th:text= "${exception}" class= "alert alert-danger" >잘못된 아이디나 암호입니다</span> </div> <form th:action= "@{/login_proc}" class= "form-signin" method= "post" > <input type= "hidden" th:value= "secret" name= "secret_key" /> <div class= "form-group" > <input type= "text" class= "form-control" name= "username" placeholder= "아이디" required= "required" autofocus= "autofocus" > </div> <div class= "form-group" > <input type= "password" class= "form-control" name= "password" placeholder= "비밀번호" required= "required" > </div> <button type= "submit" class= "btn btn-lg btn-primary btn-block" >로그인</button> </form> </div> </div> </div> </body> </html>

  • java
  • spring-boot
  • spring-security
Rain D 댓글 2 좋아요 0 조회수 334

thymeleaf tag 질문합니다.

미해결

스프링 시큐리티

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 로그인 하지 않을 때 isAnonymous() 는 동작하는데 로그인 하고 isAuthenticated() 는 동작 하지 않아서 top 메뉴에 로그아웃이 보이지 않네요 로그인 처리가 잘 안돼서 그런건가요 ??

  • java
  • spring-boot
  • spring-security
Rain D 댓글 2 좋아요 0 조회수 240

실습리포지토리 테스트 코드 작성 강의 오류

해결됨

입문자를 위한 Spring Boot with Kotlin - 나만의 포트폴리오 사이트 만들기

안녕하세요 또 이렇게 질문하게 되네요 먼저 코드는 틀린거 없이 Git 내용과 강의 내용코드 그대로 작성하였습니다. 하지만 왜 일까요?? 에러가 나네요 이부분이 에러 납니다. al experience = experienceRepository.findAll() ====================== @Test fun testFindAll() { println("---- findAll 테스트 시작 ----") val experience = experienceRepository.findAll() assertThat(experience).hasSize(DATA_SIZE) println("experiences.size: ${experience.size}") for (experience in experience) { assertThat(experience.details).hasSize(experience.title.toInt()) println("experience.details.size: ${experience.details.size}") } println("---- findAll 테스트 종료 ----") } ==================================== 이부분도요 findAllByIsActive(true) @Test fun testFindAllByIsActive() { println("----- findAllByIsActive 테스트 시작 -----") val experiences = experienceRepository.findAllByIsActive(true) assertThat(experiences).hasSize(DATA_SIZE) println("experiences.size: ${experiences.size}") for (experience in experiences) { assertThat(experience.details).hasSize(experience.title.toInt()) println("experience.details.size: ${experience.details.size}") } println("----- findAllByIsActive 테스트 종료 -----") } 에러 코드는 기니깐 핵심 부분만 올려 드리면 Hibernate: select e1_0.experience_id,e1_0.created_date_time,e1_0.description,d1_0.experience_id,d1_0.experience_detail_id,d1_0.content,d1_0.created_date_time,d1_ 0.is _active,d1_0.update_date_time,e1_0.end_month,e1_0.end_year,e1_ 0.is _active,e1_0.start_month,e1_0.start_year,e1_0.title,e1_0.update_date_time from experience e1_0 left join experience_detail d1_0 on e1_0.experience_id=d1_0.experience_id where e1_ 0.is _active=? org.springframework.orm.jpa.JpaSystemException: No default constructor for entity 'com.justkim.portfolio.domain.entity.ExperienceDetail' at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException( HibernateJpaDialect.java:341 ) 이이쿠 한줄만 적는데도 기네요 ExperienceDetail.kt 코드는 @Entity class ExperienceDetail(content: String, isActive: Boolean) : BaseEntity() { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "experience_detail_id") var id:Long? = null var content: String = content var isActive: Boolean = isActive fun update(content: String, isActive: Boolean) { this.content = content this.isActive = isActive } } 이런데 ExperienceDetail( 가 계속 경고를 때리네요 Class 'ExperienceDetail' should have [public, protected] no-arg constructor https://github.com/justkjy/portfolio-justkim 깃 주소입니다 구글에서 위 에러를 검색하니깐 인프런 오류 질문이 올라 와 있던데 봐도 모르겠네요 https://www.inflearn.com/questions/931371/test-%EC%98%A4%EB%A5%98 감사합니다.

  • kotlin
  • mysql
  • docker
  • spring-boot
  • jpa
just kim 댓글 2 좋아요 1 조회수 385

이너 클래스 vs 클래스 별도 생성의 차이?

미해결

쥬쥬와 함께 하루만에 시작하는 백엔드 - 스프링, 도커, AWS

[4-5 맛집 정보 가져오기 API 개발하기] 맛집 정보 가져오기 API 부분 코드 작성해 주시는 부분에서 (2분 34초쯤부터) 메뉴 클래스를 하나 더 만드실지 고민하시는듯 하다가 이너 클래스로 만드신 것처럼 보이는데요, 이전에 request 만드실때는 메뉴 클래스를 분리하셨는데 해당 부분에서는 고민하시다가 이너 클래스로 만드신 이유가 무엇인지 그리고 어떤 경우에 이너 클래스를 쓰고 분리를 하는지 궁금해서 문의드립니다.

  • spring
  • git
  • docker
  • spring-boot
  • jpa
  • github
gggg5555 댓글 2 좋아요 0 조회수 438

ExceptionHandler가 AccessDeniedHandler(Http403Handler)를 먹어버리는 현상

미해결

호돌맨의 요절복통 개발쇼 (SpringBoot, Vue.JS, AWS)

안녕하세요 호돌맨님 강의 항상 잘보고있습니다. 다름이 아니라 실습 중 의도치 않게 동작하는 부분이 있어 질문드립니다. 상황 회원 가입 후 로그인 이 때 유저의 Role 은 ADMIN 메소드 시큐리티로 아래와 같이 자원의 권한 제한 @RestController class HomeController { @GetMapping("/user") @PreAuthorize("hasRole('ROLE_USER')") fun user(): String { return "user 접근 가능👁" } @GetMapping("/admin") @PreAuthorize("hasRole('ROLE_ADMIN')") fun admin(): String { return "admin 접근 가능 👨‍💼" } } 이 때 ExceptionHandler로 Runtime예외를 캐치해 응답을 주고 있습니다. 동시에 커스텀한 403핸들러를 HttpSecurity에 끼워 넣어주었습니다. // ControllerAdvice @ExceptionHandler(Exception::class) fun handleRuntimeException(ex: Exception): ResponseEntity<ErrorResult> { logger.error("ex", ex) return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) .body( ErrorResult( code = "500", message = ex.message, ) ) } // SecurityConfig @Bean fun securityFilterChain(http: HttpSecurity): SecurityFilterChain { return http // .. other config.. .exceptionHandling { e -> e.accessDeniedHandler(Http403Handler(objectMapper)) e.authenticationEntryPoint(Http401Handler(objectMapper)) } .build() } 기대하는 동작 ADMIN으로 로그인한 유저가 USER 자원에 접근하면 아래와 같이 응답 { "code": "403", "message": "접근할 수 없습니다.", "validation": null } 실제 동작 { "code": "500", "message": "Access Denied", "validation": null } ControllerAdvice에서 Runtime예외를 처리하지 않는다면 의도대로 403이 응답되는데, ControllerAdvice에서 예외를 포괄적으로 처리하게 되면 403이 응답되지 않습니다. 혹시 이런경우를 겪으신적이 있는지? 따로 해결방법이 있을지 궁금해 여쭙습니다. 감사합니다.

  • vue.js
  • aws
  • spring-boot
  • jpa
  • spring-security
철이와미애 댓글 2 좋아요 0 조회수 1220

수정시에 질문있습니다!!!! Editor??

미해결

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

[질문 내용] 여기에 질문 내용을 남겨주세요. 저는 지금까지 수정을 시도할때 changeContentsAndtitle 이런 식으로 엔티티단에서 수정을 시도했는데 https://velog.io/@gundorit/Spring-%EC%A0%9C%EB%8C%80%EB%A1%9C-%EB%90%9C-CRUD-Update 이 블로그에 따르면 그것은 별로 안좋고 Editor 를 선언해서 하면 좋다는 식으로 얘기하고 있습니다. 근데 이렇게 하면 영한님이 얘기하셨던 얘기 중에 그런 이야기가 있었습니다. DTO 는 엔티티를 참조해도 되는데 , 엔티티는 DTO 를 참조하지 말라고 하셨습니다. 위 블로그에서는 Entity 에서 DTO 를 참조하지는 않는데 Entity 에서 UpdateEditor 를 선언하고 있는데 이런 부분에 문제는 없을까요?? 영한님도 이런 스타일로 하시나요?

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
dionisos198 댓글 1 좋아요 0 조회수 228

JPA와 DB설정, 동작확인 강의에서 오류메세지 발

해결됨

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 제가 오류를 못찾는건지 자료랑 비교했을 때 별 특이사항은 없는 것 같은데 자꾸 오류가 발생합니다.MEMBER_SEQ이 대체 뭔지 모르겠네요 ㅠㅠ 젤 하단 사진 테스트코드 실행 시 오류가 발생합니다. application.yml server: port: 8081 #MVCC=TRUE를 넣어주면 여러개를 한번에 접근했을 때 좀 더 빨리 처리가 된다. spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver #ddl-auto: create -> 자동으로 테이블을 만들어주는 모드 jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true System.out.~을 통해서 출력 format_sql: true #logger를 통해 출력 #로그 레벨 #hibernate SQL로그를 디버그 모드로 쓴다는 것 #-> Hibernate가 남기는 모든 로그가 다 디버그 모드로 해서 JPA나 Hibernate가 생성하는 SQL이 다 보인다. logging: level: org.hibernate.SQL: debug Member package jpabook.jpashop; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import lombok.Getter; import lombok.Setter; @Entity @Getter @Setter public class Member { @Id @GeneratedValue private long id; private String username; } MemberRepository package jpabook.jpashop; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; import org.springframework.stereotype.Repository; @Repository public class MemberRepository { @PersistenceContext private EntityManager em; public Long save(Member member){ em.persist(member); return member.getId(); } public Member find(Long id){ return em.find(Member.class,id); } } MemberRepositoryTest package jpabook.jpashop; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.transaction.annotation.Transactional; import static org.assertj.core.api.Assertions.*; import static org.junit.Assert.*; @RunWith(SpringRunner.class) //junit한테 SpringBoot로 테스트 한다고 알려주는 것 @SpringBootTest public class MemberRepositoryTest { @Autowired MemberRepository memberRepository; @Test @Transactional public void testMember(){ //given Member member=new Member(); member.setUsername("memberA"); //when Long saveID= memberRepository.save(member); Member findMember=memberRepository.find(saveID); //then assertThat(findMember.getId()).isEqualTo(member.getId()); assertThat(findMember.getUsername()).isEqualTo(member.getUsername()); } }

  • java
  • spring
  • 웹앱
  • spring-boot
  • jpa
wlwlgoyo 댓글 3 좋아요 0 조회수 831

편하게 들어도 된다고 하셨는데

미해결

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요. 1. 강의 내용과 관련된 질문을 남겨주세요. 2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요. (자주 하는 질문 링크: https://bit.ly/3fX6ygx) 3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요. (질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG) 질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요. ========================================= [질문 템플릿] 1. 강의 내용과 관련된 질문인가요? (예/아니오) 2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) [질문 내용] 이 방식이 옛날 방식이라 편하게 들어도 된다고 하셨는데 코드를 안 적어도 되나요? 아니면 나중에 최신 방식으로 알려주시나요?

  • java
  • spring
  • mvc
  • spring-boot
whdvkf5139 댓글 1 좋아요 0 조회수 804

http api test

미해결

토비의 스프링 부트 - 이해와 원리

http -v 명령어가 작동이 안되는데 혹시 제가 잘못하고 있는 것이 있을까요..?

  • spring
  • spring-boot
  • spring-jdbc
haist0617 댓글 1 좋아요 0 조회수 487

인기 태그

인프런 TOP Writers

주간 인기글