수강이 제한됩니다.
다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결스프링 시큐리티
WebSecurityConfigurerAdapter에 대해 질문이 있습니다.
위 사진에서 궁금한 점이 있습니다.WebSecurityConfigurerAdapter의 초기화는 언제 되고, WebSecurityConfigurerAdapter의 설정에 HttpSecurity 설정 이외에 자주 사용하는 설정이 있는지? 사용자 정의한 필터 적용시 적용 필터를 우선으로 사용하고 싶은 경우? 사용자가 정의한 필터 이용시 필터가 어떤 순서로 적용되는지? 다른 API 의 연동으로 다중필터 이용시 충돌이 발생하지 않는지? 다른 API와 세션값을 공유하는지? 현재 WebSecurityConfigurerAdapter는 삭제 될 예정(Deoprecated)인 클래스라고 안내문과 SecurityConfig를 사용하는 것을 권장한다는데 혹시 SecurityConfig에 대해서 알 수 있을 까요?(현재 Spring Boot 2.7.7 버전을 이용해서 프로젝트를 생성했습니다.)HttpSecurity 클래스에서 and() 메소드를 사용하는 시점을 알 수 있을까요?아래 사진에서 and()를 사용하는 곳과 사용하지 않는 곳이 있어서 언제 사용해야 하는지 이해하기 어렵습니다.
- 미해결스프링 시큐리티
개인 프로젝트 ajax 로그인
현재 강사님의 스프링 시큐리티 강의를 본 뒤 개인 프로젝트에 spring security를 이용한 로그인 처리를 진행중입니다. vue.js와 통신을 하기위해 ajax 인증 방식을 사용하려 합니다. 궁금한 점은 formlogin의 경우 여러 구현체가 spring에서 제공되는 것 같은데 ajax방식은 제공된 구현체 없이 다 커스텀 해야되는 것인지 궁금합니다. 추가로 강의 내용과 다소 멀어진 내용이지만 spring, vue 통신 시 spring에서 넘긴 쿠키를 vue에서 받으려면 어떠한 설정이 필요한지 알 수 있을까요? cors설정을 해보아도 vue에서 쿠키값이 받아지지 않아 고민입니다ㅠ
- 미해결스프링 시큐리티
BeanCreationException 에러 해결 못하고 있습니다.
에러내용org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'projectingArgumentResolverBeanPostProcessor' defined in class path resource [org/springframework/data/web/config/ProjectingArgumentResolverRegistrar.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'metaDataSourceAdvisor': Cannot resolve reference to bean 'methodSecurityMetadataSource' while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'methodSecurityConfig': Unsatisfied dependency expressed through field 'securityResourceService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityResourceService' defined in file [C:\Java Projects\corespringsecurity - 04 - 02\target\classes\io\security\corespringsecurity\service\SecurityResourceService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourcesRepository': Cannot create inner bean '(inner bean)#75a71129' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#75a71129': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is 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 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:512) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:240) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:722) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:535) ~[spring-context-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141) ~[spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE] at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747) [spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE] at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) [spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:315) [spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1226) [spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215) [spring-boot-2.2.1.RELEASE.jar:2.2.1.RELEASE] at io.security.corespringsecurity.CoreSpringSecurityApplication.main(CoreSpringSecurityApplication.java:15) [classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_202] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_202] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_202] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_202] at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49) [spring-boot-devtools-2.2.1.RELEASE.jar:2.2.1.RELEASE] Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'metaDataSourceAdvisor': Cannot resolve reference to bean 'methodSecurityMetadataSource' while setting constructor argument; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'methodSecurityConfig': Unsatisfied dependency expressed through field 'securityResourceService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityResourceService' defined in file [C:\Java Projects\corespringsecurity - 04 - 02\target\classes\io\security\corespringsecurity\service\SecurityResourceService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourcesRepository': Cannot create inner bean '(inner bean)#75a71129' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#75a71129': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is 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 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:680) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:196) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1358) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1204) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:207) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.aop.framework.autoproxy.BeanFactoryAdvisorRetrievalHelper.findAdvisorBeans(BeanFactoryAdvisorRetrievalHelper.java:91) ~[spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findCandidateAdvisors(AbstractAdvisorAutoProxyCreator.java:109) ~[spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator.findCandidateAdvisors(AnnotationAwareAspectJAutoProxyCreator.java:92) ~[spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.aop.aspectj.autoproxy.AspectJAwareAdvisorAutoProxyCreator.shouldSkip(AspectJAwareAdvisorAutoProxyCreator.java:101) ~[spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessBeforeInstantiation(AbstractAutoProxyCreator.java:251) ~[spring-aop-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1141) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation(AbstractAutowireCapableBeanFactory.java:1114) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:506) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] ... 19 common frames omitted Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'methodSecurityConfig': Unsatisfied dependency expressed through field 'securityResourceService'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityResourceService' defined in file [C:\Java Projects\corespringsecurity - 04 - 02\target\classes\io\security\corespringsecurity\service\SecurityResourceService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourcesRepository': Cannot create inner bean '(inner bean)#75a71129' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#75a71129': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is 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 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:639) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:116) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:397) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1429) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:400) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] ... 38 common frames omitted Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityResourceService' defined in file [C:\Java Projects\corespringsecurity - 04 - 02\target\classes\io\security\corespringsecurity\service\SecurityResourceService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourcesRepository': Cannot create inner bean '(inner bean)#75a71129' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#75a71129': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is 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 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:787) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:226) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1358) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1204) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1287) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:636) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] ... 57 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'resourcesRepository': Cannot create inner bean '(inner bean)#75a71129' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#75a71129': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is 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 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:389) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:134) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1706) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1451) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1287) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1207) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:874) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:778) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] ... 70 common frames omitted Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#75a71129': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is 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 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:680) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:498) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:374) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] ... 84 common frames omitted Caused by: 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 javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1803) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:595) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] ... 92 common frames omitted Caused by: javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:403) ~[spring-orm-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:378) ~[spring-orm-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341) ~[spring-orm-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1862) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1799) ~[spring-beans-5.2.1.RELEASE.jar:5.2.1.RELEASE] ... 99 common frames omitted Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing table [access_ip] at org.hibernate.tool.schema.internal.AbstractSchemaValidator.validateTable(AbstractSchemaValidator.java:121) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.hibernate.tool.schema.internal.GroupedSchemaValidatorImpl.validateTables(GroupedSchemaValidatorImpl.java:42) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.hibernate.tool.schema.internal.AbstractSchemaValidator.performValidation(AbstractSchemaValidator.java:89) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.hibernate.tool.schema.internal.AbstractSchemaValidator.doValidation(AbstractSchemaValidator.java:68) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:192) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:73) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:320) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:462) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1249) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final] at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58) ~[spring-orm-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365) ~[spring-orm-5.2.1.RELEASE.jar:5.2.1.RELEASE] at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:391) ~[spring-orm-5.2.1.RELEASE.jar:5.2.1.RELEASE] ... 103 common frames omitted 종료 코드 0(으)로 완료된 프로세스 아무리 찾아도 답은 모르겠네요.ㅠㅠ 스택 오버 플로우에서 찾은 답변은 https://stackoverflow.com/questions/55549415/error-creating-bean-with-name-projectingargumentresolverbeanpostprocessor@EnableGlobalMethodSecurity의 속성을 활성화하라는 얘기인데, 전 보시다시피 이미 다 활성화가 되어있습니다..@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) 다른 방법으로는 도저히 못찾겠네요.. @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) @Slf4j public class MethodSecurityConfig extends GlobalMethodSecurityConfiguration{ @Autowired private SecurityResourceService securityResourceService; protected MethodSecurityMetadataSource customMethodSecurityMetadataSource() { return mapBasedMethodSecurityMetadataSource(); } @Bean public MapBasedMethodSecurityMetadataSource mapBasedMethodSecurityMetadataSource() { return new MapBasedMethodSecurityMetadataSource(methodResourcesMapFactoryBean().getObject()); } @Bean public MethodResourcesMapFactoryBean methodResourcesMapFactoryBean(){ MethodResourcesMapFactoryBean methodResourcesMapFactoryBean = new MethodResourcesMapFactoryBean(); methodResourcesMapFactoryBean.setSecurityResourceService(securityResourceService); methodResourcesMapFactoryBean.setResourceType(SecurtiyMethodType.METHOD.getValue()); return methodResourcesMapFactoryBean; } // @Bean //@Profile("pointcut") /*BeanPostProcessor protectPointcutPostProcessor() throws Exception { DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory)applicationContext.getAutowireCapableBeanFactory(); Class<?> clazz = Class.forName("org.springframework.security.config.method.ProtectPointcutPostProcessor"); Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(MapBasedMethodSecurityMetadataSource.class); declaredConstructor.setAccessible(true); Object instance = declaredConstructor.newInstance(mapBasedMethodSecurityMetadataSource()); Method setPointcutMap = instance.getClass().getMethod("setPointcutMap", Map.class); setPointcutMap.setAccessible(true); setPointcutMap.invoke(instance, pointcutResourcesMapFactoryBean().getObject()); return (BeanPostProcessor)instance; }*/ /** * * 설정클래스에서 람다 형식으로 선언된 빈이 존재할 경우 오류가 발생하여 스프링 빈과 동일한 클래스를 생성하여 처리 * 아직 AspectJ 라이브러리에서 Fix 하지 못한 것으로 판단되지만 다른 오류 원인이 존재하는지 계속 살펴보도록 함 */ @Bean @Profile("pointcut") public ProtectPointcutPostProcessor protectPointcutPostProcessor() { ProtectPointcutPostProcessor protectPointcutPostProcessor = new ProtectPointcutPostProcessor(mapBasedMethodSecurityMetadataSource()); protectPointcutPostProcessor.setPointcutMap(pointcutResourcesMapFactoryBean().getObject()); return protectPointcutPostProcessor; } @Bean @Profile("pointcut") public MethodResourcesMapFactoryBean pointcutResourcesMapFactoryBean(){ MethodResourcesMapFactoryBean pointcutResourcesMapFactoryBean = new MethodResourcesMapFactoryBean(); pointcutResourcesMapFactoryBean.setSecurityResourceService(securityResourceService); pointcutResourcesMapFactoryBean.setResourceType(SecurtiyMethodType.POINTCUT.getValue()); return pointcutResourcesMapFactoryBean; } @Bean public CustomMethodSecurityInterceptor customMethodSecurityInterceptor(MapBasedMethodSecurityMetadataSource methodSecurityMetadataSource) { CustomMethodSecurityInterceptor customMethodSecurityInterceptor = new CustomMethodSecurityInterceptor(); customMethodSecurityInterceptor.setAccessDecisionManager(accessDecisionManager()); customMethodSecurityInterceptor.setAfterInvocationManager(afterInvocationManager()); customMethodSecurityInterceptor.setSecurityMetadataSource(methodSecurityMetadataSource); RunAsManager runAsManager = runAsManager(); if (runAsManager != null) { customMethodSecurityInterceptor.setRunAsManager(runAsManager); } return customMethodSecurityInterceptor; } } 아래는 pom.xml입니다.<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.1.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>io.security</groupId> <artifactId>corespringsecurity</artifactId> <version>0.0.1-SNAPSHOT</version> <name>corespringsecurity</name> <description>Core Spring Security</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.thymeleaf.extras</groupId> <artifactId>thymeleaf-extras-springsecurity5</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>2.3.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
- 미해결스프링 시큐리티
login 페이지
26:30 에 인증 예외에 대한 핸들링 메소드를 주석 처리한 뒤 스프링 시큐리티가 제공하는 login 페이지로 넘어가던데, sendRedirect 와 관련해서 머릿속이 어지러워졌습니다. /login 경로는 permitAll 상태/login 에 대한 GetMapping 문제 없이 존재그럼 어나니머스로 인증되지 않습니까?정상적으로 "login" 텍스트가 화면에 나와야되는데왜 시큐리티가 제공하는 로그인페이지가 나타날까요? authenticationEntryPoint 에 주석하기 전에 sendRedirect를 호출하여 사용자를 /login 페이지로 이동시켰습니다.리다이렉트는 사용자 브라우저에 전달한 URI를 요청시키는 건 줄 알았는데,그렇다면 주석을 하든 말든 /login 경로에 대한 모든 요청은 허가하는 상태에서, 시큐리티가 제공하는 로그인페이지는 GetMapping 핸들러가 존재하는 한 화면에 나타나면 안된다고 생각하는데 제가 어떤 것을 놓치고 있는 건지 궁금합니다
- 미해결스프링 시큐리티
로그인 페이지 설정
.loginPage() 설정에서 /login.html을 예시로 적어주셨던데 API만 적어주면 되나요 도메인도 같이 적어줘야 하나요?로그인하는 rest API가 /api/login 이라면 /api/login만 적어주면 되는지.. test.com/api/login 이렇게 도메인까지 적어줘야 하는지 궁금합니다.
- 해결됨스프링 시큐리티
로그인 성공, 실패 후 처리 관련 질문
안녕하세요 수원님!로그인 성공, 실패 관련 질문드립니다. 로그인 실패시 처리할 수 있는 메소드가failureUrl()failureHandler()위와 같이 2개인것으로 이해 했습니다. 그런데 failureHandler()에서 /login2으로 redirect를 했는데 failureUrl()에서 지정한 곳(/login)으로 리다이렉트 하는 것을 확인했습니다.로그인에 실패하면 failureHandler()에서 지정한 곳으로는 redirect가 불가능 한건가요?onAuthenticationFailure()에서 로그까지 실행되는것은 확인했습니다. 반대로 로그인 성공시에는 successHandler()가 defaultSuccessUrl()보다 우선순위가 높은것 같더군요. private void formConfigure(HttpSecurity http) throws Exception { http .authorizeRequests() .anyRequest().authenticated(); http .formLogin() //.loginPage("/loginPage") // 사용자 정의 로그인 페이지 .defaultSuccessUrl("/home", true) // 로그인 성공 후 이동 페이지(default false) .failureUrl("/login") // 로그인 실패 후 이동 페이지 .usernameParameter("username") // 아이디 파라미터명 설정 .passwordParameter("password") // 패스워드 파라미터명 설정 .loginProcessingUrl("/login_proc") // 로그인 from action url .successHandler(loginSuccessHandler) // 로그인 성공 후 핸들러 .failureHandler(loginFailureHandler) // 로그인 실패 후 핸들러 .permitAll(); } @Slf4j @Component public class LoginFailureHandler implements AuthenticationFailureHandler { @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { log.info("exception={}", exception.getMessage()); response.sendRedirect("/login2"); } } @Slf4j @Component public class LoginSuccessHandler implements AuthenticationSuccessHandler { @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { log.info("authentication={}", authentication.getName()); response.sendRedirect("/home2"); } } 감사합니다.
- 미해결스프링 시큐리티
생성한 FilterSecurityInterceptor 에 권한 정보가 매핑되지 않는 이유
안녕하세요. 19분 설명해주시는 부분에서 의문점이 생겨서 질문드립니다. 저희가 설정한 customFilterSecurityInterceptor 는 다음과 같습니다.@Bean public FilterSecurityInterceptor customFilterSecurityInterceptor() throws Exception { FilterSecurityInterceptor filterSecurityInterceptor = new FilterSecurityInterceptor(); filterSecurityInterceptor.setSecurityMetadataSource(filterInvocationSecurityMetadataSource()); filterSecurityInterceptor.setAccessDecisionManager(affirmativeBased()); // 가장 많이하는 ADM을 세팅해준다. filterSecurityInterceptor.setAuthenticationManager(authenticationManagerBean()); return filterSecurityInterceptor; } 똑같은 FilterSecurityInterceptor 를 선언해 필요한 설정들만 custom 객체들로 넣어준 후 반환해주는 형식입니다. 그리고 설정해준 authorization url 경로 설정들은 다음과 같았습니다. http .authorizeRequests() .antMatchers("/mypage").hasRole("USER") .antMatchers("/messages").hasRole("MANAGER") .antMAtchers("/config").hasRole("ADMIN") .anyRequest().authenticated() .and() .addFilterBefore(customFilterSecurityInterceptor(), FilterSecurityInterceptor.class)이 때, 저희가 적용한 필터를 먼저 끼워준다고 해서 왜 권한 정보들을 못받아오는지 궁금합니다. 서버 기동시 ExpressionBasedFilterInvocationSecurityMetadataSource.class 에서 설정한 권한 URL 정보들을 Meta-data로 저장한다고 설명해주셨습니다. 하지만 이 부분에서 "이 시점에 FilterSecurityInterceptor Bean" 에 이 requestMap metadata를 넣어주는 것도 아닌 것 같아보이는데 왜 못받아오는지 궁금합니다! 이 requestMap 을 받아오는 것을 수행하는게 FilterInvocationSecurityMetadataSource.class 인 것 같은데, DefaultFilter~Source.class를 봐도 결국 생성자에서 주입받는 것 같습니다.public DefaultFilterInvocationSecurityMetadataSource( LinkedHashMap<RequestMatcher, Collection<ConfigAttribute>> requestMap) { this.requestMap = requestMap; }이 클래스 생성이 어디에서 되는지는 모르겠지만, 결국 저장된 METADATA를 어디에서 생성후 여기에 넣어주는 것 아닐까요? 그럼 저희가 만든 Url~MetaDataSource.class 도 생성자 주입을 통해서 넣어줄 수 있는 것 아닐까요? 또한, CustomUrlFilterInvocationSecurityMetadataSource 를 왜 만드셨는지 조금 궁금합니다! 이전 프로젝트였던 Ajax Authentication 같은 경우는 기존 FormLogin 과는 다르게 설정할 부분이 있었고, AccountContext와 같이 앱 내에서의 멤버 객체와 Security를 연동해주는 과정이 따로 필요해서 Token, Provider 등을 커스텀화하는 것이 이해가 되었습니다. 또한 추후 Token 구현 같은 것을 할 때도 참고가 정말 많이 되는 것 같았습니다. 하지만 이 Filter 같은 경우는 그냥 기존에 하는 역할 똑같이 수행하는 것 같은데, 왜 Custom 화 한 클래스가 따로 생성이 필요한지 궁금합니다! 별 다른 의도가 아니라 Custom Class를 만들어 보면서 Authorization 과정을 눈으로 보면서 이해해보기 위함일까요?
- 미해결스프링 시큐리티
loginPage 리다이렉션 루프 문제
수원님 안녕하세요! 강의대로 진행하면loginPage에서 리다이렉션 루프에 빠지게 됩니다. http .authorizeRequests() // 요청에 대한 보안 검사 .antMatchers("/loginPage").permitAll() // 어떤 요청도 허용 .anyRequest().authenticated(); // 어떤 요청에도 인증을 받음 위 내용을 추가해야 할 것 같습니다. 감사합니다.
- 미해결스프링 시큐리티
메소드 보안을 사용하게 되는 상황
메소드 보안은 언제 주로 사용하게 될까요?일반적으로 자원과 권한 매핑, 사용자에게 권한 할당만으로도 충분히 커버가 될거 같은데요.메소드 보안은 사용자 권한 관리에 보조적으로? 사용될까요?
- 미해결스프링 시큐리티
안녕하세요 허용 Ip설정 관련 질문있습니다!
안녕하세요권한/자원 정보는 RequestMap에 멤버변수로 저장해서 꺼내쓰잖아요~허용 Ip설정은 요청마다 매번 인가 필터에서 DB에서 가져와서 체크하는 것으로 보이는데(IpAddressVoter 클래스에 vote 메소드안securityResourceService.getAccessIpList() 호출)Ip 접근제어시에도 동일하게권한/자원 정보처럼 초기화시 멤버변수에 저장하고 수정될때 reload하는 방식으로 사용하는게 효율적이지 않나요?관련해서 구현해본 적이 없어서 궁금합니다 !
- 미해결스프링 시큐리티
security 질문 있습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 현재 vuejs + springboot를 사용해서 토이 프로젝트를 하나 진행 중인데요.검색해보니 보통 네비게이션 가드를 사용하여 접근 권한을 제어하던데혹시 spring security의 접근 제어만으로 vuejs의 접근 제어도 가능한지 궁금합니다.
- 미해결스프링 시큐리티
Security 듣는 중 드리는 질문
매번 여쭤보기보다 누적했다가 한번에 질문드리는게 더 좋을 것 같은데 강의를 일일이 찾기 어려워 한번에 올리겠습니다. 1. MySecurityConfig.class에 붙은 @Configuration은 어떤 일을 하나요?>> @Configuration은 내부에 있는 @Bean 메소드를 스프링 컨테이너에서 싱글톤으로 관리될 수 있게끔 보장해주는 Annotation인 것으로 알고 있습니다. 하지만 Spring Configuration 클래스 내부에는 별다른 Bean 등록 객체가 없는 것 같은데, 추상적으로 [Spring에게 이 Security Configuration을 사용할거야]라고 알려주는 것보다 조금 더 무슨 역할을 하는지 궁금해서 질문 드립니다. 2.UserDetailService, CustomAuthenticationProvider 등을 왜 직접 Custom화 하는건가요?>> 그 때마다 앱 내에서 사용하는 Authorities들과 [사용자]로 쓰는 객체가 매번 달라서 그렇다고 이해하면 될까요? 가령, 앱에서는 [Member, Account] 등을 사용, Spring 에서는 UserDetails란 인터페이스를 지원 3. CustomAuthenticationProvider 만 따로 Bean 주입 메소드를 작성해준 이유가 있을까요?@Bean public AuthenticationProvider authenticationProvider() { return new CustomAuthenticationProvider(); }>> AuthenticationProvider 역할의 구현체를 이 앱에선 CustomAuthProvider 구현체를 사용할 것이다라는 메소드를 통해 Bean 등록을 해주는 모습입니다. 하지만 CustomUserDetailService 는 @Service Annotation을 통해 바로 컨테이너에 넣었습니다. 이는 @Service 내에 포함되어 있는 @Component로 인해 Bean 등록이 되는 것으로 알고 있습니다. 이 때, CustomAuthenticationProvider는 @Component로 하지 않고 저렇게 메소드로 해주는 이유가 있을까요? 4. CustomAuthenticationProvider.class 내 authenticate()에 대해서@Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { String username = authentication.getName(); String credentials = (String) authentication.getCredentials(); // 비번 AccountContext userDetails = (AccountContext) userDetailsService.loadUserByUsername(username); // UDS에서 알맞은 유저 가져온다 (우리가 만들어준 객체를 사용할 것이라 등록함) if(!passwordEncoder.matches(credentials, userDetails.getAccount().getPassword())){ String msg = "비밀번호 불일치, 인증 실패하였습니다"; log.error("Error while handling CustomAuthenticationProvider authenticate(): {}", msg); throw new BadCredentialsException("Error while handling CustomAuthenticationProvider authenticate():: " + msg); } // 일치하면 인증 완료, Authentication 온전한 결과를 넣어줘야 한다 // Form 에서 사용하는 Authentication 객체는 하위 (근데 새로 만들어줌?) UsernamePasswordAuthenticationToken authenticatedToken = new UsernamePasswordAuthenticationToken(userDetails.getAccount(), null, userDetails.getAuthorities()); return authenticatedToken; }다음은 강의에서 사용하신 소스코드 입니다! 이전에 해주신 이론 설명을 바탕으로 해당 코드를 작성하면서 생긴 의문은 Authentication authentication 객체입니다. " AuthenticationProvider에서 받은 [인증 전] Authentication 객체와 내보낼 [인증 후] Authentication 객체가 같은 객체이다"라고 해주셨던 것 같은데, 해당 코드 아래에서 Authentication 인증 객체를 새로 생성하는 것 같은데, 왜 그런지 알 수 있을까요? 5. Bean 주입 관련3번 질문과 연관된 질문입니다! 직접적으로 Security 관련이 아닌 Bean 주입 관련한 내용이라... 양해부탁드립니다 ㅠ.ㅠ 다름이 아니라 직접 Bean 주입을 3번과 같이 하는게 아니라 @Component로 한다면, 자동으로 해당 구현객체를 쓴다는 점이 궁금합니다! 가령, 위에 AuthenticationProvider 의 구현체를 CustomAuthentication 으로 사용한다고 직접적으로 Bean 주입을 해줬기 때문에 해당 구현체를 사용하는 것이 이해가 가지만, CustomUserDetailsService 클래스 같은 경우 @Service annotation 으로 빈 등록을 하게 해줬습니다. 이럴 때는 기존에 사용하고 있던 UserDetailsService 구현체는 어떻게 사용하지 않는다는걸 스프링이 알게 될까요? @Service 를 사용하는 것은 자동주입이고, 기존에 Security 가 사용하는 구현체는 수동 주입했을 것 같은데, 이럴 경우 수동 주입이 우선권을 가지게 되지 않나 싶어서 문의드립니다! 감사합니다.
- 미해결스프링 시큐리티
@AuthenticationPrincipal 관련 질문
안녕하세요 강사님강의를 듣던중 궁금한 점이 있어 질문드립니다. 인증 객체를 컨트롤러에서 사용할 때 @AuthenticationPrincipal 어노테이션을 사용하면 받을 수 있다하여 적용해 보았습니다. @AuthenticationPrincipal AccountContext 로 객체를 받았는데 값이 계속 null이 와서 해결방안이 있을까 해 질문드립니다. 다른 블로그를 보니 Adapter라는 이름으로 클래스를 만들던데 방식이 차이가 없는것 같은데 저는 객체가 들어오지 않더라구요ㅠㅠ
- 해결됨스프링 시큐리티
IP 접속 제한에 대해
안녕하세요. 9) 아이피 접속 제한하기 - CustomIpAddressVoter 강에서'등록한 IP에 대한 접속 제한'이 아닌 '등록한 IP에 대한 접속 허용'으로 구현하였는데 제 생각에는 일반적인 웹 서비스에서는 전자가 사용될 것으로 생각되어 의아함을 느꼈습니다.그래서 아래와 같이 등록된 IP에 대해 접속이 제한되도록 바꾸었습니다.@Override public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> configList) { if (!(authentication.getDetails() instanceof WebAuthenticationDetails)) { return ACCESS_DENIED; } WebAuthenticationDetails details = (WebAuthenticationDetails) authentication.getDetails(); String address = details.getRemoteAddress(); List<String> accessIpList = securityResourceService.getAccessIpList(); for (String ipAddress : accessIpList) { if (address.equals(ipAddress)) { throw new AccessDeniedException("Invalid IP Address"); } } return ACCESS_ABSTAIN; } '등록한 IP에 대한 접속 허용' 으로 구현한 이유가 있을까요?수정한 코드에 잘못된 부분이 있다면 지적 부탁드립니다. (기능은 잘 되는 것으로 보입니다.)
- 미해결스프링 시큐리티
익명사용자 객체에 대한 질문
익명 사용자 객체가 왜 있는지 잘 이해가 안됩니다 ㅠ. isAuthenticated == false 로 그냥 구분하면 되지 않나요? 왜 굳이 Anonymous 라는 객체를 따로 두는지 궁금합니다. 가령, 수업 중에 예시로 드신 로그인 페이지를 구성할 때, anonymous 이면 로그인 화면, authenticated 면 로그아웃 화면 이런식으로 사용한다 하셨습니다. 전자를 그냥 authenticated == false 로도 충분히 구분 가능한 것 같은데, 왜 굳이 anonymous 객체를 필터까지 기본 API로 두는지 궁금합니다. 그리고 httpSecurity 설정 부분에서 아무 부가 설정 없는 것 같은데, 그냥 기본으로 들어가는 필터로 보면 되는걸까요? 감사합니다.
- 미해결스프링 시큐리티
Remember Me 에 대한 몇 가지 질문
안녕하세요~! 강의를 듣던 중 질문의 몇 가지 있어서 남기게 되었습니다. 1.https://www.inflearn.com/questions/497954해당 질문에 답변에서 세션에는 Security Context가 저장되고, S.C 안에는 Authentication 객체가 저장되는 걸로 이해를 하였습니다.스프링 입장에서 봤을 때, 특정 로그인 요청 > 인증 진행 > 인증 완료 및 Authentication 객체 형성 > Security Context에 저장 > 응답으로 쿠키에 세션을 넣어서 전달의 순서로 이해를 했다면, Security Context 는 혹시 앱 내에 저장소? 같은 공간일까요? 앱 내의 스프링 컨테이너 역시 ApplicationContext처럼 Context 가 저장소 같은 느낌으로 쓰이는가 싶어서요. 만약 그렇다면, Security Context 에는 현재 앱에 "로그인이 되어 있다, 인증 되어 있다" 라고 하는 유저들의 Authentication 객체가 모두 저장되어 있는 것으로 이해를 해도 될까요? 또 만약 그렇다면, 각 유저에게 세션을 전달하게 되는데... Security Context를 어떻게 세션에 모두 넣어서 전달을 하는 걸까요..? 질문이 좀 난해하지만 유저에게 전달한다는 Session, Security Context가 정확히 무엇인지?에 대해서 궁금한 것 같습니다. 2. SessionID 를 주고 받음으로써 이미 "로그인 상태, 인증 상태" 를 판별할 수 있는 것 같은데, 굳이 remember-me 를 또 사용하는 이유는 뭔가요? 그리고 http.rememberMe() 설정 중에 갑자기 .userDetailService 가 등장했는데 그냥 설정만 해주시고 넘어간 것 같습니다. 해당 부분이 어떤 부분인지 알 수 있을까요?감ㅅ합니다.
- 해결됨스프링 시큐리티
Remember Me
안녕하세요. remember-me 기능을 처리하는 과정에서 문제가 발생하여 질문 남깁니다. 먼저 강의를 따라 구현한 AuthenticationProvider 구현체와 rememberMe 관련 설정입니다. remeber-me input을 체크하고 로그인을 시도하였습니다.인증을 마치고 RemeberMeService 를 거쳐 TokenBasedRememberMeServices 에서 토큰을 만드는 과정에서 username 과 password 를 조회하는데 인증 객체가 UserPasswordAuthenticationToken 인스턴스이기 때문에 아래 조건문에 따라 toString() 을 반환합니다.결과적으로 아래와 같이 다른 username 을 반환받았습니다. 그리고 비밀번호를 조회하여 null 을 반환받고 그로 인해 password 를 찾기위해 아래 조건식에 따라 loadUserByUsername 을 통해 user 를 조회하게 됩니다. 이 과정에서 UsernameNotFoundException 예외가 발생합니다.단순히 toString() 을 username 을 반환하도록 구현하여 해결했습니다만잘못 구현된 부분이나 잘못 이해한 부분 혹은 다른 해결방법이 있는지에 대해 질문 드립니다. --추가--아래와 같이 수정하는 방법으로도 해결됨을 확인하였습니다.토큰에 Account, null 을 준 방식과 어떠한 차이점이 있는지 알고 싶습니다.
- 미해결스프링 시큐리티
ajax로 로그인 시 오류
IpAddressVoter.java 의 public int vote(Authentication authentication, Object object, Collection<ConfigAttribute> attributes) {....} 에서인자인 Authentication authentication 객체 안에FormWebAuthenticationDetails 객체가 null 로 IP정보를 가져오지 못합니다.사용자 IP를 가져올 방법이 없을까요?
- 미해결스프링 시큐리티
@Bean, @Componet 질문
@ComponentFormAuthenticationDetailsSource 의 경우 .java 소스파일에 @Component 를 명시했습니다.@Component public class FormAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> { @Override public WebAuthenticationDetails buildDetails(HttpServletRequest request) { return new FormWebAuthenticationDetails(request); } }따라서 securityConfig설정클래스의 멤버변수에 @Autowired 로 의존관계설정이 가능하였고 이 것을 아래 코드에서 사용됐습니다..formLogin() .loginPage("/login") //로그인 페이지의 GET 요청 엔드포인트 .loginProcessingUrl("/login_proc") //로그인 시도의 POST요청 엔드포인트 .defaultSuccessUrl("/") //로그인 성공후 루트페이지로 이동 .authenticationDetailsSource(authenticationDetailsSource) @BeanSecurityConfig에 메소드를 정의하고 @Bean을 설정하는 경우참고로, 5) 인증 및 인가 예외 처리 - AjaxLoginUrlAuthenticationEntryPoint 강의의 08:49에서는 @Bean 없이 메소드를 정의했습니다. .and() .exceptionHandling() .accessDeniedHandler(ajaxAccessDeniedHandler()) ... public AccessDeniedHandler ajaxAccessDeniedHandler(){ return new AjaxAccessDeniedHandler(); } new 생성자() 호출하는 경우 .and() .exceptionHandling() .authenticationEntryPoint(new AjaxLoginAuthenticationEntryPoint()) 위 세 가지 케이스로 패턴을 정리할 수 있었는데 공통점은 IoC컨테이너에 빈객체를 생성한다는 점입니다. 차이점은 어떤 것이 있는지 알고싶습니다.
- 미해결스프링 시큐리티
ResourceServerConfigurerAdapter와 차이가 뭔가요?
WebSecurityConfigurerAdapter와 ResourceServerConfigurerAdapter의 차이가 궁금합니다. 이름만 보면 웹, 리소스에대한 보안으로 다를거 같은데, 정확한 용도가 어찌 다른지 궁금하네요.