programing

스프링 부트를 사용한 유닛 테스트의 보안을 무효화

megabox 2023. 3. 5. 09:41
반응형

스프링 부트를 사용한 유닛 테스트의 보안을 무효화

보안으로 심플한 스프링 부트 웹 프로젝트를 작성하려고 합니다.애플리케이션을 정상적으로 기동할 수 있고 보안도 정상적으로 동작하고 있습니다.단, 보안 없이 테스트하고 싶은 컴포넌트가 몇 가지 있습니다(또는 전혀 테스트하지 않습니다).

Object Post Processor를 찾을 수 없으므로 컨테이너를 시작할 수 없음을 나타내는 예외가 발생합니다.

원인: org.springframework.콩류.Such Bean Definition 없음예외:[ or . spring framework ]타입의 정규 콩이 없습니다.security.configuration.configuration.configuration.configuration.information.종속성에 대한 ObjectPostProcessor]를 찾았습니다.

14:01:50.937 [main]에러 os.boot.Spring Application - 응용 프로그램 부팅 실패org. springframework.콩류.빈크리에이션예외:이름이 'fmpdfApplication'인 bean을 생성하는 동안 오류가 발생했습니다.응용 프로그램 보안':자동 배선 종속성을 주입하지 못했습니다. 중첩된 예외는 org.springframework입니다.콩류.빈크리에이션예외:메서드를 자동 연결할 수 없습니다. public void org.springframework.security.configuration.configuration.configuration.configuration.information.web.configuration을 클릭합니다.Web Security Configurer Adapter.setObjectPostProcessor(또는 스프링프레임워크).security.configuration.configuration.configuration.configuration.information.Object Post Processor).네스트된 예외는 org.springframework입니다.콩류.Such Bean Definition 없음예외:[ or . spring framework ]타입의 정규 콩이 없습니다.security.configuration.configuration.configuration.configuration.information.종속성에 대한 ObjectPostProcessor]를 찾았습니다. 이 종속성에 대한 자동 배선 후보로 적격인 콩이 하나 이상 필요합니다.종속성 주석: {}org.springframework에 있습니다.콩.공장.배송.Autowired Annotation Bean Post Processor 。postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.추상적인AutoowireAbleBeanFactory.populateBean(개요)AutoowireAbleBeanFactory.java:1210)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.추상적인AutoowireAbleBeanFactory.doCreateBean(개요)AutoowireAbleBeanFactory.java:537)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.추상적인AutoowireAbleBeanFactory.createBean(개요)AutoowireAbleBeanFactory.java:476)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.Abstract Bean Factory $1.get Object(Abstract Bean Factory.java:303)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.Abstract Bean Factory.DoGet Bean(Abstract Bean Factory.java:2999)~[봄콩-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)~[봄콩-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework.springframework지지하다.Abstract Application Context.finish Bean Factory(완료 콩 팩토리)초기화(Abstract Application Context.java:757)~[ spring - context - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework.springframework지지하다.Abstract Application Context.refresh(Abstract Application Context.java:480)~[ spring - context - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework.boot에 있습니다.Spring Application.refresh(Spring Application).java:686)~[ spring - boot - 1.2 . 4 ]RELEASE.jar: 1.2.4.릴리스]org.springframework.boot에 있습니다.SpringApplication.run(SpringApplication).java:320)~[ spring - boot - 1.2 . 4 ]RELEASE.jar: 1.2.4.릴리스]org.springframework.boot.test에서 참조할 수 있습니다.Spring Application Context Loader.load Context(Spring Application Context Loader.java:103) [Spring-boot-1.2.4]RELEASE.jar: 1.2.4.릴리스]org.springframework.test.test.http: 에서DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate).java:68) [스프링 테스트 4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate).java:86) [스프링 테스트-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서DefaultTestContext.getApplicationContext(DefaultTestContext.java:72) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서지지하다.의존주입Test Execution Listener.inject Dependencies(의존관계)주입Test Execution Listener.java:117) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서지지하다.의존주입Test Execution Listener.prepare Test Instance(의존관계)주입Test Execution Listener.java:83) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서TestContextManager.prepareTestInstance(TestContextManager.java:212) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서Junit 4. 봄JUnit4ClassRunner.createTest(스프링)JUnit4ClassRunner.java:200) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서Junit 4. 봄JUnit4 ClassRunner $1 . run Reflective Call ( Spring )JUnit4ClassRunner.java:259) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.junit에서.internal.model.ReflectiveCallable.run(ReflectiveCallable.java:12) [junit-4.12.jar:4.12]org.springframework.test.test.http: 에서Junit 4. 봄JUnit4ClassRunner.methodBlock(스프링)JUnit4ClassRunner.java:261) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서Junit 4. 봄JUnit4ClassRunner.runChild(스프링)JUnit4ClassRunner.java:219) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서Junit 4. 봄JUnit4ClassRunner.runChild(스프링)JUnit4ClassRunner.java:83) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.junit.http에서.ParentRunner$3.run(ParentRunner.java:290) [junit-4.12.jar:4.12]org.junit.http에서.ParentRunner$1.schedule(ParentRunner.java:71) [junit-4.12.jar:4.12]org.junit.http에서.ParentRunner.runChildren(ParentRunner.java:288) [junit-4.12.jar:4.12]org.junit.http에서.ParentRunner.access$000(ParentRunner.java:58) [junit-4.12.jar:4.12]org.junit.http에서.Parent Runner $ 2. evaluate ( Parent Runner . java : 268) [junit - 4.12 . jar : 4.12 ]org.springframework.test.test.http: 에서junit 4. 스테이트먼트RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.springframework.test.test.http: 에서junit 4. 스테이트먼트Run After Test Class Callbacks.evaluate(Run After Test Class Callbacks.java:68) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.junit.http에서.ParentRunner.run(ParentRunner.java:363) [junit-4.12.jar:4.12]org.springframework.test.test.http: 에서Junit 4. 봄JUnit4ClassRunner.run(스프링)JUnit4ClassRunner.java:163) [spring-test-4.1.6]RELEASE.jar: 4.1.6.릴리스]org.junit.runner에서요JUnitCore.run(JUnitCore.java:137) [junit-4.12.jar:4.12]com에서.인텔리junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) [junit-rt.jar:na]com에서.intellij.rt.discl.discljunit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212) [junit-rt.jar:na]com에서.intellij.rt.discl.discljunit.JUnitStarter.main(JUnitStarter.java:68) [junit-rt.jar:na]햇빛을 반사하다Native Method Accessor Impl.invoke0(네이티브 메서드) ~[ na : 1 . 8 . 0 _ 45 ]햇빛을 반사하다Native Method Accessor Impl.호출(NativeMethodAccessorImpl.java:62)~[na:1.8.0_45]햇빛을 반사하다Method Accessor Impl을 위임하고 있습니다.호출(DelegatingMethodAccessorImpl.java:43)~[na:1.8.0_45]java.displect.reflect에 있습니다.Method.invoke(Method.java:497)~[na:1.8.0_45]com에서.intellij.rt.displicate.application을 선택합니다.AppMain.main(AppMain.java:140) [idea_rt.jar:na]원인: org.springframework.콩류.빈크리에이션예외:메서드를 자동 연결할 수 없습니다. public void org.springframework.security.configuration.configuration.configuration.configuration.information.web.configuration을 클릭합니다.Web Security Configurer Adapter.setObjectPostProcessor(또는 스프링프레임워크).security.configuration.configuration.configuration.configuration.information.Object Post Processor).네스트된 예외는 org.springframework입니다.콩류.Such Bean Definition 없음예외:[ or . spring framework ]타입의 정규 콩이 없습니다.security.configuration.configuration.configuration.configuration.information.종속성에 대한 ObjectPostProcessor]를 찾았습니다. 이 종속성에 대한 자동 배선 후보로 적격인 콩이 하나 이상 필요합니다.종속성 주석: {}org.springframework에 있습니다.콩.공장.배송.Autowired Annotation Bean Post Processor $Autowired Method Element.(Autowired Annotation Bean Post Processor.java:649) ~[ spring - beans - 4.1 . 6 ]를 선택합니다.RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩.공장.배송.Injection Metadata(Injection Metadata)injectionMetadata.java:88)~[ spring - beans - 4.1 . 6 ]를 선택합니다.RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩.공장.배송.Autowired Annotation Bean Post Processor 。postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:33)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]43개의 공통 프레임 생략원인: org.springframework.콩류.Such Bean Definition 없음예외:[ or . spring framework ]타입의 정규 콩이 없습니다.security.configuration.configuration.configuration.configuration.information.종속성에 대한 ObjectPostProcessor]를 찾았습니다. 이 종속성에 대한 자동 배선 후보로 적격인 콩이 하나 이상 필요합니다.종속성 주석: {}org.springframework에 있습니다.콩류.지지하다.Default Listable Bean Factory.raise No Such Bean Definition예외(DefaultListableBeanFactory.java:1301)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1047)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩류.지지하다.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:942)~[ spring - beans - 4.1 . 6 ]RELEASE.jar: 4.1.6.릴리스]org.springframework에 있습니다.콩.공장.배송.Autowired Annotation Bean Post Processor $Autowired Method Element.inject (Autowired Annotation Bean Post Processor.java:606) ~[ spring - beans - 4.1 . 6 ]를 선택합니다.RELEASE.jar: 4.1.6.릴리스]... 45개의 공통 프레임 생략

웹이나 보안과 관련된 어떤 것도 테스트하려고 하지 않습니다.내 부품 중 하나를 테스트하는 중이야My Unit 테스트(구빈 단위)는 다음과 같습니다.

@RunWith(SpringJUnit4ClassRunner)
@SpringApplicationConfiguration(classes = FmpdfApplication)
@ActiveProfiles(["test", "mockstore"])
class PdfUpdaterTest {

    @Resource PdfUpdater pdfUpdater
    ...

그리고 나의 (관련된) gradle 의존관계는 다음과 같습니다.

compile("org.springframework.boot:spring-boot-starter-actuator")
compile("org.springframework.boot:spring-boot-starter-security")
compile("org.springframework.boot:spring-boot-starter-web")
compile("org.springframework.boot:spring-boot-starter-jdbc")
testCompile("org.springframework.boot:spring-boot-starter-test")

management.security.enabled=false security.basic.enabled=false 설정을 시도했지만 도움이 되지 않았습니다.

기타 관련 정보:보안을 커스터마이즈해야 했기 때문에 다음과 같은 패턴을 따릅니다.

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter {
        @Override
        public void configure(AuthenticationManagerBuilder auth) throws Exception {
    ..

이게 문제의 일부인가요?관련된 것이라면 @lazy로 할 수 있는 방법이 있습니까?

업데이트: 유닛 테스트를 @Web Integration으로 표시한 경우테스트 후 모든 것이 작동하지만 내장된 Tomcat 서버를 시작합니다.유닛 테스트용 비웹용 스프링보안을 비활성화하려면 어떻게 해야 하나요?

답변 업데이트: 최근에 배운 또 다른 옵션은 컨트롤러를 테스트하기 위해 MockMvc 및 AutoConfigureMockMvc를 사용하는 경우 컨트롤러에 적용되는 보안을 해제하기 위해 secure=false를 설정할 수 있습니다.

@AutoConfigureMockMvc(secure = false)

기본 인증을 위해 아래와 같이 진행하지 않을 경우.


예외는 제가 받은 것과 매우 다르지만 테스트 케이스를 실행하는 동안 보안을 해제하려면 프로파일을 사용하고 테스트 프로파일의 속성을 사용하여 기본 보안을 해제해 보십시오.이게 내가 한 일이야

  1. 추가 ★★★★@Profile(value = {"development", "production"})을 실시하기 위해서WebSecurityConfigurerAdapter-
    @Configuration
    @EnableWebSecurity
    @Profile(value = {"development", "production"})
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

2. 아, 아, 에test/resources, 작성, 작성application-test.yml이 합니다.

    # Security enable/disable
    security:
      basic:
        enabled: false

이 케이스에 3을 합니다.@ActiveProfiles(value = "test")이렇습니다 - 게게우 . . . . . . . . . . . 。

    @RunWith(SpringJUnit4ClassRunner.class)
    @SpringApplicationConfiguration(classes = Application.class)
    @WebAppConfiguration
    @ActiveProfiles(value = "test")
    @IntegrationTest({"server.port=0"})
    public class SampleControllerIntegrationTest {

이렇게 하면 테스트 케이스 보안이 해제되어 인증된 URL에 액세스할 수 있었습니다.이게 당신에게도 효과가 있기를 바랍니다.행운을 빈다!!!

FmpdfApplication 주석이 있을 것 같다.@EnableAutoConfiguration (와)@SpringBootApplication, 즉 , 즉 메타어법, 메타어법, 즉 메타어법.@EnableAutoConfiguration스프링 시큐리티

하려면 , 앱을 해, 「」에 해 .autoconfigendpoint(를 들어 http://localhost:8080/autoconfig).그런 다음 '보안'을 검색하여 어떤 '자동 구성' 클래스가 탐지되는지 확인합니다.

그런 다음 다음과 같은 클래스를 제외함으로써 보안 자동 설정을 디세블로 할 수 있습니다.

@EnableAutoConfiguration(exclude = { SecurityAutoConfiguration.class, ManagementSecurityAutoConfiguration.class })

물론 실제 가동 환경에 도입할 때 제외하는 것은 바람직하지 않습니다. 때문에 따로 따로 합니다.@Configuration★★★★★★★★★★★★★★★★★★★★★★★★★★★

안부 전해요,

샘.

p.s. 다음 질문에도 도움이 될 수 있습니다.스프링 부트 모듈 기반 통합 테스트

경우에는 ★★★★★★★★★★★★★★★★★★★★★★★★★.@AutoConfigureMockMvc(addFilters = false)날 도와줬어

예:

@WebMvcTest(MyController.class)
@AutoConfigureMockMvc(addFilters = false)
@TestPropertySource(locations="classpath:application-test.properties")
public class MyControllerTests {

건배.

테스트를 위해 스프링 부트 보안을 해제하려면 이 옵션을 사용해 보십시오.


@AutoConfigureMockMvc(보안 = false)

@RunWith(SpringRunner.class)
@WebMvcTest(SampleController.class)
@AutoConfigureMockMvc(secure = false)
public class SampleControllerIntegrationTest {

Security Spring Security를 .@WithMockUser테스트에서 사용자를 빠르게 조롱합니다.

http://docs.spring.io/spring-security/site/docs/4.0.x/reference/htmlsingle/ # 테스트

저는 테스트 주석을 업데이트하여 수정했습니다.이제 잘 된다.

송신원:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc

수신인:

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
@ActiveProfiles(value = "test")
@AutoConfigureMockMvc(addFilters = false)

어플리케이션이 웹 기반은 아니지만 스프링 보안 jar가 의존관계로 필요하고 테스트 중에 스프링 보안을 위한 스프링 부트의 자동 구성을 원하지 않는 경우 다음을 추가할 수 있습니다.

@SpringBootTest(webEnvironment = WebEnvironment.NONE)

당신의 시험 수업에서.

이 주석을 테스트 클래스에 추가하면 됩니다. @AutoConfigureMockMvc(addFilters = false)

응용 프로그램을 사용하여 문제를 해결하려면.yml은 다음 작업을 수행할 수 있습니다(솔루션은 Sam Brannen이 승인한 답변과 동일하지만 속성 파일을 사용합니다).아직 존재하지 않으면 테스트 폴더에 application.yml을 만듭니다.

   spring:
     profiles:
       active: integration-test
   autoconfigure:
     exclude:
      - org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
      - org.springframework.boot.actuate.autoconfigure.security.servlet.ManagementWebSecurityAutoConfiguration

다음으로 통합 테스트를 다음과 같이 설정합니다.

@SpringBootTest(webEnvironment = RANDOM_PORT)
@ActiveProfiles("integration-test")

이것은 스프링 부트 2.7.x에서 사용하는 솔루션입니다.

이 접근법에서는 프로파일메커니즘을 사용합니다.

테스트 프로파일을 사용하면, 모든 콜의 시큐러티가 무효가 됩니다.

@Bean
@Profile("test")
public WebSecurityCustomizer webSecurityCustomizer() {
 //Since we added the Spring Security to pom.xml and the spring security default
 //Behavior is ... well to secure and block all traffic
 //This will disable the behavior when testing none secured related tests
 return web -> web.ignoring().anyRequest();
}

제게는 테스트 주석을 업데이트하는 것이 수정이었습니다.대체:

@SpringApplicationConfiguration(classes = { MyApplication.class })
@RunWith(SpringJUnit4ClassRunner.class)

와 함께

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = MyApplication.class)

다른 할 수 .@ActiveProfile. 다음과 같은 별도의 yml 파일을 만듭니다.application-nosecurity.yml , 「 」의 내용은 과 같습니다.

security:
  ignored: /**

그럼 에는 시험 에 '시험하다'로 을 달아주세요.@ActiveProfile("nosecurity")다음과 같이 합니다.

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
@ActiveProfile("nosecurity")
public class BlaBlaTest {

   ## Your Test Code 

}

webMvcTest에서만 이 오류가 발생할 경우 다음 테스트의 보안 클래스 설정을 제외해야 합니다.

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
@Profile(value = {"!test"})
public class XXXX extends WebSecurityConfigurerAdapter {

보안을 해제하고 싶은 것은 이해하지만, Mockito에서 사용자를 모킹할 수 있는 주석이 하나 있습니다.

@WithMockUser(username = "Test", authorities = {"USER"})

클래스와 함께 사용하면 메서드뿐만 아니라 모든 메서드를 조롱할 수 있습니다.메서드가 클래스를 덮어씁니다.

이렇게 하면 관리자 고유의 방법을 테스트할 수 있습니다.쓸모 있는 것 같아요.

컨트롤러 테스트에서는 다음과 같이 userService 및 비밀번호 인코더를 조롱해야 할 수 있습니다.

@ExtendWith(SpringExtension.class)
@WebMvcTest(Controller.class)
@WithMockUser(username = "Test", authorities = {"USER"})
class ControllerTest {

    @Autowired
    MockMvc mockMvc;

    @MockBean
    AppUserService userService;

    @MockBean
    PasswordEncoder passwordEncoder;

    @MockBean
    SomeBusinessService someBusinessService;

언급URL : https://stackoverflow.com/questions/31169720/disable-security-for-unit-tests-with-spring-boot

반응형