在Spring Boot中为单元测试禁用安全性
在Spring Boot中为单元测试禁用安全性
我正在尝试创建一个带有安全性的简单的Spring Boot Web项目。我可以正常启动应用程序,并且安全性也能正常工作。然而,我有一些组件需要在没有安全性的情况下进行测试(或者根本不进行测试 - 我无法使测试正常工作)。\n我得到了一个异常,指示找不到ObjectPostProcessor对象,因此无法启动容器。\nCaused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.springframework.security.config.annotation.ObjectPostProcessor] found for dependency\n我甚至没有尝试测试与Web或安全性相关的任何内容。我只是在单元测试我的一个组件。\n我的单元测试(用Groovy编写)如下:\n
@RunWith(SpringJUnit4ClassRunner) @SpringApplicationConfiguration(classes = FmpdfApplication) @ActiveProfiles(["test", "mockstore"]) class PdfUpdaterTest { @Resource PdfUpdater pdfUpdater ...
\n而我的(相关的)gradle依赖如下:\n
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")
\n我尝试设置\nmanagement.security.enabled=false\nsecurity.basic.enabled=false\n但是这没有起作用。\n另一个相关的信息是:我需要自定义安全性,所以我按照以下模式进行操作:\n
@Configuration @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) protected static class ApplicationSecurity extends WebSecurityConfigurerAdapter { @Override public void configure(AuthenticationManagerBuilder auth) throws Exception { ..
\n这是问题的一部分吗?如果相关,有办法使其@Lazy吗?\n更新:如果我将单元测试标记为@WebIntegrationTest,那么一切都正常工作 - 但是它会启动一个嵌入式的tomcat服务器。如何在单元测试非Web内容时禁用Spring Security?
在使用Spring Boot进行单元测试时,可能会遇到禁用安全性的问题。解决这个问题的方法是在测试类上添加(addFilters = false)
注解。下面是一个示例:
(MyController.class) (addFilters = false) (locations="classpath:application-test.properties") public class MyControllerTests {
通过使用这种方法,我找到了我想要的解决方案!之前我使用Mockito手动设置MockMvc对象进行测试,现在我改用这些注解来加载更多的配置bean,这些bean设置了生产应用程序的web mvc,可能会影响控制器的行为(例如jackson ObjectMapper配置),而无需额外手动设置这些配置。
使用这种方法,我遇到了"Failed to load ApplicationContext"的错误。
问题:在Spring Boot中如何为单元测试禁用安全性?
原因:在应用程序的主类(FmpdfApplication)上可能使用了@EnableAutoConfiguration注解(或使用了meta-annotation @SpringBootApplication,该注解会自动配置Spring Security)。这将导致Spring Security通过自动配置进行拾取和配置。
解决方法:要查看正在自动配置的内容,可以启动Web应用并访问autoconfig端点(例如,http://localhost:8080/autoconfig)。然后搜索'Security'以查看检测到的“AutoConfiguration”类。
然后,可以通过排除这些类来禁用安全性的自动配置,如下所示:
(exclude = {SecurityAutoConfiguration.class, ManagementSecurityAutoConfiguration.class}
当然,您不会希望在生产环境中排除它们。因此,您需要为生产和测试分别创建一个注解类。
另外,您可能还会发现我对以下问题的答案也很有用:Spring-Boot模块化集成测试。
需要注意的是(exclude = {SecurityAutoconfiguration.class, ManagementWebSecurityAutoConfiguration.class})将在src/test/java中的注解类上。还要注意使用了ManagementWebSecurityAutoConfiguration.class(我使用的是Spring Boot 1.3.0)。
另外,如果您在pom中没有引入actuator,/autoconfig可能不起作用。在src/test/resources/application.properties中添加logging.level.org.springframework=DEBUG,可以查看自动配置带来的报告。
对于Spring Boot 2.7.x,它必须是"ManagementWebSecurityAutoConfiguration.class",请注意"Web"部分。
在使用Spring Boot进行单元测试时,有时需要禁用安全性。下面是禁用安全性的原因和解决方法。
原因:当运行测试用例时,可能会遇到安全性相关的异常,需要禁用安全性以使测试能够正常运行。
解决方法:
1. 如果使用MockMvc和AutoConfigureMockMvc来测试控制器,可以在其上设置secure=false来禁用与控制器相关的任何安全性。
(secure = false)
2. 如果不使用MockMvc和AutoConfigureMockMvc,可以使用配置文件和测试配置文件来禁用基本安全性。
a. 在实现WebSecurityConfigurerAdapter的类上添加注解(value = {"development", "production"})
。
b. 在test/resources目录下创建application-test.yml文件,并定义测试配置文件的属性,添加如下内容:
# Security enable/disable
security:
basic:
enabled: false
c. 在测试用例上添加注解(value = "test")
,指定应用测试配置文件。示例:
(SpringJUnit4ClassRunner.class) (classes = Application.class) (value = "test") ({"server.port=0"}) public class SampleControllerIntegrationTest {
通过以上步骤,可以禁用测试用例的安全性,从而能够访问经过身份验证的URL。希望这对你也有帮助。祝好运!