inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

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

org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [FKASNMJAR8JR5GAXVD7966P19IR]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement

미해결

Spring Boot JWT Tutorial

안녕하세요? 이 강의를 보고, 이 강의를 토대로 토이 프로젝트를 진행하고 있습니다. 근데 계속 아래와 같은 Exception이 터지고 있습니다. 다수 회원을 생성 합니다! Hibernate: insert into member (member_id, modify_date, register_date, about_me, activated, email, name, nickname, password, phone) values (null, ?, ?, ?, ?, ?, ?, ?, ?, ?) Hibernate: insert into member_authority (member_id, authority_name) values (?, ?) 2022-02-09 23:42:57.821 WARN 11871 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Error: 23506, SQLState: 23506 2022-02-09 23:42:57.821 ERROR 11871 --- [ main] o.h.engine.jdbc.spi.SqlExceptionHelper : Referential integrity constraint violation: "FKASNMJAR8JR5GAXVD7966P19IR: PUBLIC.MEMBER_AUTHORITY FOREIGN KEY(AUTHORITY_NAME) REFERENCES PUBLIC.AUTHORITY(AUTHORITY_NAME) ('ROLE_FAMILY')"; SQL statement: insert into member_authority (member_id, authority_name) values (?, ?) [23506-200] 2022-02-09 23:42:57.823 INFO 11871 --- [ main] o.h.e.j.b.internal.AbstractBatchImpl : HHH000010: On release of batch it still contained JDBC statements org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [FKASNMJAR8JR5GAXVD7966P19IR]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement at org.springframework.orm.jpa.vendor.HibernateJpaDialect.convertHibernateAccessException(HibernateJpaDialect.java:276) at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:233) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:566) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:174) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215) at com.sun.proxy.$Proxy142.save(Unknown Source) at org.comunity.hongga.repository.MemberRepositoryTest.lambda$회원_100명_생성_상세_조회$0(MemberRepositoryTest.java:76) at java.base/java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Streams.java:104) at java.base/java.util.stream.IntPipeline$Head.forEach(IntPipeline.java:593) at org.comunity.hongga.repository.MemberRepositoryTest.회원_100명_생성_상세_조회(MemberRepositoryTest.java:57) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.junit.platform.commons.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:725) at org.junit.jupiter.engine.execution.MethodInvocation.proceed(MethodInvocation.java:60) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation.proceed(InvocationInterceptorChain.java:131) at org.junit.jupiter.engine.extension.TimeoutExtension.intercept(TimeoutExtension.java:149) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestableMethod(TimeoutExtension.java:140) at org.junit.jupiter.engine.extension.TimeoutExtension.interceptTestMethod(TimeoutExtension.java:84) at org.junit.jupiter.engine.execution.ExecutableInvoker$ReflectiveInterceptorCall.lambda$ofVoidMethod$0(ExecutableInvoker.java:115) at org.junit.jupiter.engine.execution.ExecutableInvoker.lambda$invoke$0(ExecutableInvoker.java:105) at org.junit.jupiter.engine.execution.InvocationInterceptorChain$InterceptedInvocation.proceed(InvocationInterceptorChain.java:106) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.proceed(InvocationInterceptorChain.java:64) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.chainAndInvoke(InvocationInterceptorChain.java:45) at org.junit.jupiter.engine.execution.InvocationInterceptorChain.invoke(InvocationInterceptorChain.java:37) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:104) at org.junit.jupiter.engine.execution.ExecutableInvoker.invoke(ExecutableInvoker.java:98) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.lambda$invokeTestMethod$7(TestMethodTestDescriptor.java:214) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.invokeTestMethod(TestMethodTestDescriptor.java:210) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:135) at org.junit.jupiter.engine.descriptor.TestMethodTestDescriptor.execute(TestMethodTestDescriptor.java:66) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:151) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at java.base/java.util.ArrayList.forEach(ArrayList.java:1541) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.invokeAll(SameThreadHierarchicalTestExecutorService.java:41) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$6(NodeTestTask.java:155) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$8(NodeTestTask.java:141) at org.junit.platform.engine.support.hierarchical.Node.around(Node.java:137) at org.junit.platform.engine.support.hierarchical.NodeTestTask.lambda$executeRecursively$9(NodeTestTask.java:139) at org.junit.platform.engine.support.hierarchical.ThrowableCollector.execute(ThrowableCollector.java:73) at org.junit.platform.engine.support.hierarchical.NodeTestTask.executeRecursively(NodeTestTask.java:138) at org.junit.platform.engine.support.hierarchical.NodeTestTask.execute(NodeTestTask.java:95) at org.junit.platform.engine.support.hierarchical.SameThreadHierarchicalTestExecutorService.submit(SameThreadHierarchicalTestExecutorService.java:35) at org.junit.platform.engine.support.hierarchical.HierarchicalTestExecutor.execute(HierarchicalTestExecutor.java:57) at org.junit.platform.engine.support.hierarchical.HierarchicalTestEngine.execute(HierarchicalTestEngine.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:107) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:88) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.lambda$execute$0(EngineExecutionOrchestrator.java:54) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.withInterceptedStreams(EngineExecutionOrchestrator.java:67) at org.junit.platform.launcher.core.EngineExecutionOrchestrator.execute(EngineExecutionOrchestrator.java:52) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:114) at org.junit.platform.launcher.core.DefaultLauncher.execute(DefaultLauncher.java:86) at org.junit.platform.launcher.core.DefaultLauncherSession$DelegatingLauncher.execute(DefaultLauncherSession.java:86) at org.junit.platform.launcher.core.SessionPerRequestLauncher.execute(SessionPerRequestLauncher.java:53) at com.intellij.junit5.JUnit5IdeaTestRunner.startRunnerWithArgs(JUnit5IdeaTestRunner.java:71) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54) Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59) at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:37) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:200) at org.hibernate.engine.jdbc.batch.internal.NonBatchingBatch.addToBatch(NonBatchingBatch.java:46) at org.hibernate.persister.collection.AbstractCollectionPersister.recreate(AbstractCollectionPersister.java:1352) at org.hibernate.action.internal.CollectionRecreateAction.execute(CollectionRecreateAction.java:50) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:604) at org.hibernate.engine.spi.ActionQueue.lambda$executeActions$1(ActionQueue.java:478) at java.base/java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:475) at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:344) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:40) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1402) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:493) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3285) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2420) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:449) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:562) ... 87 more Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: Referential integrity constraint violation: "FKASNMJAR8JR5GAXVD7966P19IR: PUBLIC.MEMBER_AUTHORITY FOREIGN KEY(AUTHORITY_NAME) REFERENCES PUBLIC.AUTHORITY(AUTHORITY_NAME) ('ROLE_FAMILY')"; SQL statement: insert into member_authority (member_id, authority_name) values (?, ?) [23506-204] at org.h2.message.DbException.getJdbcSQLException(DbException.java:527) at org.h2.message.DbException.getJdbcSQLException(DbException.java:496) at org.h2.message.DbException.get(DbException.java:227) at org.h2.message.DbException.get(DbException.java:203) at org.h2.constraint.ConstraintReferential.checkRowOwnTable(ConstraintReferential.java:311) at org.h2.constraint.ConstraintReferential.checkRow(ConstraintReferential.java:252) at org.h2.table.Table.fireConstraints(Table.java:1163) at org.h2.table.Table.fireAfterRow(Table.java:1181) at org.h2.command.dml.Insert.insertRows(Insert.java:188) at org.h2.command.dml.Insert.update(Insert.java:135) at org.h2.command.dml.DataChangeStatement.update(DataChangeStatement.java:61) at org.h2.command.CommandContainer.update(CommandContainer.java:173) at org.h2.command.Command.executeUpdate(Command.java:252) at org.h2.server.TcpServerThread.process(TcpServerThread.java:408) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:831) at org.h2.message.DbException.getJdbcSQLException(DbException.java:459) at org.h2.engine.SessionRemote.done(SessionRemote.java:611) at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237) at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:191) at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:152) at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:197) ... 107 more @Test public void 회원 _100 명 _ 생성 _ 상세 _ 조회 () { // given System . out . println( " 다수 회원을 생성 합니다 !" ) ; // 50 번까지 FAMILY // 100 번까지 GUEST IntStream . rangeClosed ( 1 , 100 ) . forEach( i -> { if ( i <= 50 ) { Authority authority = Authority . builder () . authorityName( "ROLE_FAMILY" ) . build() ; Member memberMany = Member . builder () . email( "whoami" + i + "@hongga.com" ) . password( passwordEncoder . encode( "1234" )) . name( " 손님 " + i ) . nickname( " 손님이에영 " + i ) . phoneNumber( "010-3948-4934" ) . activated( true ) . authorities( Collections . singleton ( authority )) . build() ; // when Member saveManyFamily = memberRepository . save( memberMany ) ; // then System . out . println( assertThat ( memberMany ) . isEqualTo( saveManyFamily )) ; } else { Authority authority = Authority . builder () . authorityName( "ROLE_GUEST" ) . build() ; Member memberMany = Member . builder () . email( "whoami" + i + "@hongga.com" ) . password( passwordEncoder . encode( "1234" )) . name( " 손님 " + i ) . nickname( " 손님이에영 " + i ) . phoneNumber( "010-3948-4934" ) . activated( true ) . authorities( Collections . singleton ( authority )) . build() ; // when Member saveManyGuest = memberRepository . save( memberMany ) ; // then System . out . println( assertThat ( memberMany ) . isEqualTo( saveManyGuest )) ; } // if-else 끝 }) ; System . out . println( "===============================================================" ) ; System . out . println( " 회원 조회를 시작 합니다 !" ) ; //given IntStream . rangeClosed ( 1 , 100 ) . forEach( i -> { String email = "whoami" + i + "@hongga.com" ; // when Member byEmail = memberRepository . findByEmail( email ) ; // then System . out . println( assertThat ( email ) . isEqualTo( byEmail )) ; }) ; } // 회원 _ 상세 _ 조회 () 끝 이렇게 TEST 코드를 작성해서 여러 회원을 검색하고, 비교 해 보려고 하는데 안 됩니다. 의심 가는 건 저는 회원 등급을 GUEST, FAMILY, ADMIN으로 사용하고 싶은데, 혹시 이걸 Check하거나 뭐 그러는 곳이 있나요?? 조언 부탁 드리겠습니다! https://github.com/junyharang-personal-project/hongga-community-server

  • spring-boot
  • jwt
댓글 1 좋아요 0 조회수 1928

영상 13:41 초에 질문이 있습니다.

미해결

스프링부트 시큐리티 & JWT 강의

먼저 spring boot 2.6X 버전 java17 로 하고있습니다. 영상 13:41 에 BycryptPasswordEncoder 를 주입하면 Spring 순환 참조가 걸리지 않는지 궁금해서 질문 남깁니다. 저는 순환참조에 걸려 PricipaOauth2UserService 에서 new BycryptPasswordEncoder 로 생성을하여 따로 주어서 해결을 했습니다. 감사합니다.

  • Spring Security
  • spring
  • jwt
민경재 댓글 1 좋아요 2 조회수 344

JWT 리턴 이후의 과정이 궁금합니다

미해결

탄탄한 백엔드 NestJS, 기초부터 심화까지

클라이언트가 로그인 하게되면 JWT를 발급받아 헤더에 이 토큰을 포함시켜서 다음 요청을 보내는 걸로 알고있습니다. 수업에서는 signin 메서드에서 token을 리턴해준 뒤에 직접 postman의 Authorization에 있는 Bearer Token 부분에 삽입해준 뒤에 다음 요청을 보냈는데 singin 메서드에서 리턴받은 token을 최종적으로 리턴하기만 하면 클라이언트에서 그 토큰을 자동으로 헤더에 포함시켜서 다음요청을 보내는 것인지 궁금합니다. 아니면 이 토큰을 프론트엔드단에서 받아서 다른 처리가 필요한지 궁금합니다.

  • jwt
  • express
  • nodejs
  • mongodb
  • ssr
  • NestJS
차동준 댓글 1 좋아요 1 조회수 513

BCryptPasswordEncoder 관련 Error

미해결

스프링부트 시큐리티 & JWT 강의

package com.junyharang.jwtstudy.config.jwt ; import com.fasterxml.jackson.databind.ObjectMapper ; import com.junyharang.jwtstudy.auth.PrincipalDetails ; import com.junyharang.jwtstudy.model.Member ; import lombok. RequiredArgsConstructor ; import org.springframework.security.authentication. AuthenticationManager ; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken ; import org.springframework.security.core. Authentication ; import org.springframework.security.core. AuthenticationException ; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter ; import javax.servlet.http. HttpServletRequest ; import javax.servlet.http. HttpServletResponse ; import java.io.IOException ; // 스프링 시큐리티에 UsernamePasswordAuthenticationFilter 가 있다 . // /login 이 요청 오면 username, password 를 전송하면 (Post 로 ) // UsernamePasswordAuthenticationFilter 가 동작한다 . // 현재는 SecurityConfig 에서 FormLogin 을 disable 을 시켜서 동작하지 않는다 . @RequiredArgsConstructor public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter { private final AuthenticationManager authenticationManager ; @Override // /login 요청이 들어오면 로그인 시도를 위해 실행되는 Method public Authentication attemptAuthentication( HttpServletRequest request , HttpServletResponse response ) throws AuthenticationException { System . out . println( "JwtAuthenticationFilter : 로그인 시도 중 입니다 !" ) ; // 1. username, password 를 받는다 . try { // BufferedReader reader = request.getReader(); // // String input = null; // // while ((input = reader.readLine()) != null) { // System.out.println(input); // } // while 문 끝 // JSON 으로 전달된 값을 Parsing 할수 있게 해주는 객체 생성 ObjectMapper om = new ObjectMapper() ; Member member = om . readValue( request . getInputStream() , Member .class ) ; System . out . println( member ) ; // Token 생성 ( 회원의 이름과 Password 를 통해 ) UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( member . getUsername() , member . getPassword()) ; // PrincipalDetailsService 의 loadUserByUsername() 이 실행 된다 . // authenticationManager 에 Token 을 넣어 호출한다 . // authentication 변수에는 Login 정보가 담긴다 . Authentication authentication = authenticationManager . authenticate( authenticationToken ) ; // authentication 객체가 Session 영역에 저장된다 . PrincipalDetails principal = ( PrincipalDetails ) authentication . getPrincipal() ; // 출력이 된다면 Login 이 되었다는 의미 System . out . println( principal . getMember() . getUsername()) ; return authentication ; } catch ( IOException e ) { e . printStackTrace() ; } // try-cache 문 끝 System . out . println( "===========================================" ) ; // 2. authenticationManager 로 정상 인지 로그인 시도하면 PrincipalDetailsService 가 호출된다 . // 해당 Class 안에 loadUserByUsername() 가 자동 호출 // 3. PrincipalDetails 를 Session 에 담는다 . // Session 에 해당 내용을 담는 이유는 담지 않으면 권한에 대한 처리를 할 수 없기 때문이다 . // 4. JWT 를 만들어서 응답해 준다 . return null ; } // attemptAuthentication(HttpServletRequest request, HttpServletResponse response) 끝 } // class 끝 안녕하세요? 25강에 해당 부분을 하다가 DB에 회원값이 들어가 있는 걸 보고, 회원가입 로직이 누락 되었다는 부분을 찾기 위해 Controller를 보고 아래 내용을 추가 하였습니다. @PostMapping( " join " ) public String join(@RequestBody Member member ) { member . setPassword( bCryptPasswordEncoder . encode( member . getPassword())) ; member . setRolse( "ROLE_USER" ) ; memberRepository . save( member ) ; return " 회원가입완료 " ; } 그리고 나서 SecurityConfig에 아래 내용을 추가 하였구요. @Autowired private MemberRepository memberRepository ; @Autowired private CorsConfig corsConfig ; @Bean public PasswordEncoder passwordEncoder(){ return new BCryptPasswordEncoder() ; } // passwordEncoder() 끝 private final CorsFilter corsFilter ; 근데 아래와 같은 Error가 발생 합니다. Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. 2022-01-19 00:25:02.184 ERROR 17752 --- [ restartedMain] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPLICATION FAILED TO START *************************** Description: Parameter 1 of constructor in com.junyharang.jwtstudy.controller.RestAPIController required a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' that could not be found. Action: Consider defining a bean of type 'org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder' in your configuration.

  • jwt
  • Spring Security
  • spring
댓글 1 좋아요 0 조회수 3069

Entity에 @Data에 대한 질문

미해결

스프링부트 시큐리티 & JWT 강의

안녕하세요? 강의를 듣다가 궁금한 점이 있어 질문 드립니다. Entity Class에 Setter를 사용하면 안된다고 배웠는데, @Data를 사용하시는 이유가 있으실까요??

  • spring
  • Spring Security
  • jwt
댓글 1 좋아요 0 조회수 408

JWT를 굳이 사용하는 이유가 뭘까요?

미해결

스프링부트 시큐리티 & JWT 강의

무료로 이렇게 좋은 강의영상 올려주셔서 정말 감사합니다. 너무 많은 도움이 되네요. 전부터 JWT 토큰을 왜 사용하는지에 대해서 의문을 가지고 있었는데, 명확한 답이 나오지 않아 질문드립니다. 세션에 대한 문제점 (서버 확장시, 스티키 세션을 사용하거나, 세션 클러스터링을 해야하는 문제)를 해결하기 위해 사용된다는 것은 알겠습니다만, JWT를 사용하는 예제들 보면 리프레시토큰도 함께 사용하여, 어세스토큰을 제발급하는 용도로 사용하더군요. 그럼 리프레시토큰은 결국 세션과 마찬가지로 DB(혹은 레디스 등의 메모리 DB)등에 저장이 되어 관리되어질텐데, 그렇게 된다면 세션과 결국 별 차이점이 없지 않을까요? 이 문제를 가지고, 여러 사람들에게 물어보았으나, 딱히 세션에 비해 가지는 장점이 없어지는 것 같더라고요. 물론 리프레시토큰을 사용하지 않고 AccessToken만 사용하는 경우에는 장점이 있다는 것을 알겠습니다. 1. 정리하자면, RefreshToken을 사용하는 경우 세션에 비해 가지는 장점이 있는가? 2. 없다면 굳이 JWT는 왜 사용하는가? 입니다

  • jwt
  • Spring Security
  • spring
신동훈 댓글 1 좋아요 5 조회수 3039

AuthController 질문있습니다

해결됨

Spring Boot JWT Tutorial

안녕하세요, 우선 좋은 강의 감사합니다. ^___^ 다름이 아니라 강의를 실습하는 중 문제가 생겨 한 가지 여쭙고 싶습니다! /api/authenticate 경로로 요청을 보내면 JwtFilter의 doFilter 로직을 타더라구요. 그래서 요청 헤더에 아무런 값이 없기 때문에 "유효한 JWT 토큰이 없습니다" 문장이 로그에 찍힙니다. SecurityConfig에 /api/authenticate 경로는 .permitAll() 을 해줬기 때문에 해당 doFilter 로직을 타면 안될 것 같은데, 혹시 제 생각이 맞는지 여쭤보고 싶습니다. 혹시 추가로... 강사님 깃허브 코드랑 비교해봐도 크게 다른점이 잘 안보이고.. 포스트맨으로 POST 요청까지 크게 다른 점을 모르겠는데.. 혹시 "유효한 JWT 토큰이 없습니다" 라고 뜨는 경우에 코드상에 살펴볼만한 포인트가 있을까요..? 감사합니다.

  • spring-boot
  • jwt
이승호 댓글 3 좋아요 2 조회수 557

27장 따라하는 중입니다. Controller를 안타는듯 합니다.

미해결

스프링부트 시큐리티 & JWT 강의

감이 잘 안와서 질문 올립니다. git@github.com:afgman4/jwt.git 27강 - jwt토큰 서버 구축완료 강의까지 다 봤는데.. 마지막 장에서 JwtAuthorizationFilter 에 디버깅을 걸고 해봤는데 중단점도 잘 걸리고.. principal에 값 세팅 잘되는 것도 확인이 되었습니다. @GetMapping ( "/api/v1/user" ) public String user (Authentication authentication){ PrincipalDetails principalDetails = (PrincipalDetails) authentication.getPrincipal() ; System. out .println(principalDetails.getUser()) ; return "user" ; } 부분에 중단점을 찍고 디버깅을 했는데 안타네요. /api/v1/user 로 하면 왜 body 에 1이라는 값이 박히는지 도통이해가 안갑니다. "user"라고 떠야 할거 같은데 말이죠..;; /api/v1/admin 하면 403 에러 잘 떠서 좋은데.. JwtAuthorizationFilter 에서 SecurityContext에 세팅을 하고 controller로 넘어와야 할거 같은데 안오는게 이상하네요 제 소스에 뭐가 잘못된게 있을까요?

  • spring
  • Spring Security
  • jwt
afgman4 댓글 3 좋아요 0 조회수 542

postman 실행 결과

해결됨

Spring Boot JWT Tutorial

안녕하세요. 강의 잘 듣고 있는 학생입니다! 다름이 아니라 이클립스를 통해 프로젝트를 생성하고 예제 소스와 똑같이 만들었는데 postman으로 테스트 결과 저렁게 나오네요... 구글링해도 잘 모르겠어서 댓글 남깁니다.

  • jwt
  • spring-boot
kcc940602 댓글 6 좋아요 0 조회수 1308

refresh token에 대해서

해결됨

따라하며 배우는 NestJS

Passport에서Refresh Token의 남은 유효기간에 따라서 기간이 얼마 남지 않으면 Refresh Token이 재발급(반대로 유효기간이 많이 남았다면 액세스토큰만 재발급)되게 하고 싶은데 너무 어렵네요, Express에서는 쉽게 가능했지만, Nest에서는 Strategy, Guard 등등에 맞춰서 개발하려다 보니 생각보다 제약이 좀 있어서 어렵네요.... 혹시 위와같은 예제같은건 없을까요? ㅠㅠ

  • nest.js
  • passport.js
  • NestJS
  • jwt
  • refresh-token
  • TypeORM
  • postgresql
묘단 댓글 1 좋아요 0 조회수 870

AuthController에서 loadByUsername 메서드 실행 경로

미해결

Spring Boot JWT Tutorial

authenticationManagerBuilder.getObject().authenticate(authenticationToken);이 실행되면 loadUserByUsername으로 어떻게 넘어가지는지 이해가 되지 않습니다. loadUserByUsername은 customUserDatailSevice의 메서드인데 어째서 authenticationdml authentiacate메서드를 실행하면 CustomUserDatailService의 메서드가 호충되는 건가요?

  • spring-boot
  • jwt
이삐삐 댓글 1 좋아요 0 조회수 1982

Dependency Injection에 관해

미해결

따라하며 배우는 NestJS

안녕하세요 선생님, 항상 좋은 강의 감사드립니다. DI 관련해서 궁금한 점이 생겨 질문드립니다. Controller에서 Service 클래스를 DI 받을 때는 별도의 데코레이션 없이 DI를 받았는데, service 계층에서 repository를 DI 받을 때는 왜 @InjectRepository가 필요할까요? 개인적으로 생각해보기로는, 우리가 직접 만든 Service 클래스는 Nest IOC container에서 관리되지만, Repository 클래스는 TypeORM 모듈에 의해 DI가 관리되기 때문일 수도 있겠다는 생각을 해봤습니다.

  • postgresql
  • NestJS
  • TypeORM
  • jwt
front 댓글 2 좋아요 0 조회수 500

refresh token 적용

미해결

탄탄한 백엔드 NestJS, 기초부터 심화까지

refresh token 적용 강의를 좀 부탁드려도 될까요 ?

  • jwt
  • nodejs
  • refreshtoken
  • mongodb
  • express
  • ssr
  • NestJS
김도현 댓글 1 좋아요 1 조회수 268

안녕하세요 강의자료 질문드립니다!

미해결

따라하며 배우는 NestJS

안녕하세요! 항상 좋은 강의 올려주셔서 도움많이 받고 있는 1인입니다. 다름이아니라 수업자료를 다운받으면 DS_STORE 파일로 밖에 안보이는데 윈도우에서는 어떻게 확인하는 방법이 있나요?

  • TypeORM
  • jwt
  • NestJS
  • postgresql
steady 댓글 1 좋아요 1 조회수 459

genericFilterBean

해결됨

Spring Boot JWT Tutorial

genericFilterBean에 doFilter라는 메소드가 없네요.. ㅠㅠ 이제 바뀐걸까요?

  • spring-boot
  • jwt
wcsjinn 댓글 1 좋아요 0 조회수 445

permitAll()질문드립니다.

해결됨

Spring Boot JWT Tutorial

기존질문 - security config에서 antMatchers.permitAll()이 작동하지 않는 것 같습니다. 찾아보니 csrf때문이란 말도 있어 csrf.disable사용해봐도 똑같이 계속 401에러가 뜹니다. ㅠ 왜 이러는 걸까요.. ++해결 config파일을 메인클래스와 같은 패키지안에 넣지않아서 bean을 인식하지 못하는 경우였습니다. 같은 패키지안에 넣으니 해결되었습니다!! 추가질문!!! 근데 추가적으로 왜 메인클래스안에 넣지않으면 인식이 되지않는 것인지 궁금합니다. 이게 스프링부트 작동순서와 연관된 것 인가요?

  • jwt
  • spring-boot
wcsjinn 댓글 2 좋아요 5 조회수 932

dependency설정

해결됨

Spring Boot JWT Tutorial

spring start에서 dependency넣지않고 나중에 따로 넣는다했을때 공식적으로 어떤 dependency를 써야한다고 적힌 문서는 어떻게 찾아야하나요? 구글에 spring security gradle dependency 등등 여러가지로 쳐봐도 공식문서를 못찾겠네요 ㅠ

  • spring-boot
  • jwt
wcsjinn 댓글 2 좋아요 0 조회수 386

lombok 실무에서 고려해야 하는 점이 있는게 뭔가요?

해결됨

Spring Boot JWT Tutorial

안녕하세요. 강사님! 실무에서는 lombok을 사용할 때 고려해야할 몇가지 점이 잇어 주의해서 사용해야한다고 하셨는데 (4:58) 어떤 부분인가요?

  • 4:58초
  • spring-boot
  • jwt
김혜정 댓글 1 좋아요 2 조회수 1263

Refresh Token, Logout

해결됨

Spring Boot JWT Tutorial

안녕하세요. 좋은 강의 덕분에 JWT를 이용하여 로그인 기능을 구현하였습니다. 그 과정에서 토큰 만료기한을 짧게 설정하고 해당 사용자의 이벤트가 있을때마다 토큰 만료기한을 연장하여 사용자 관리를 하고 싶습니다. 그래서 JWT 인증 정보를 SecurityContext에 저장하기 전에 Claims에 만료 기한을 설정한 후 저장했는데 수정되지 않아서요. 제가 잘못된 방법인건지 혹은 다른 좋은 방법이 있을까요? 추가적으로 로그아웃 시 위의 방법이 됐을 경우 만료기한을 현재시점으로 하여 만료시키면 될까요? 답변 부탁드립니다.

  • logout
  • 로그아웃
  • spring-boot
  • refresh
  • jwt
  • token
NG Kim 댓글 1 좋아요 1 조회수 3566

MSA @PreAuthorize

해결됨

Spring Boot JWT Tutorial

안녕하세요. 선생님의 강의를 듣고 MSA에 JWT 기반 인증 인가 서비스를 구현 중입니다. 구현 중에 Auth Server를 분리하면서 다른 리소스 서버에서 @PreAuthorize로 메소드 단위 권한 인가를 구현하며 유추한 내용이 맞는지 확인차 질문 드립니다. 제가 생각한 @PreAuthorize의 동작 메커니즘은 아래와 같습니다. JwtFilter 클래스에서 Override하여 구현한 doFilter는 매 서블릿 요청마다 작동됩니다. 그리고 doFilter에서 UsernamePasswordAuthentication 객체를 SecurityContextHolder에 저장합니다. @PreAuthorize를 코멘트한 메소드에서는 SecurityContextHolder에 저장된 내용을 기반으로 권한을 체크합니다. 여기까지가 제가 유추한 내용인데요. 틀린 부분이 있으면 첨언 부탁드립니다. 그리고 위와 같은 방법 외에 MSA처럼 Auth Server를 분리한다던가 또는 ScaleOut된 서비스와 같이 분리된 아키텍처에서 권한인가하는 효율적인 방법이 또 있을까요?

  • PreAuthorize
  • jwt
  • spring-boot
이민준 댓글 1 좋아요 1 조회수 534

인기 태그

인프런 TOP Writers

주간 인기글