在Spring Boot中为单元测试禁用安全性

10 浏览
0 Comments

在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?

0
0 Comments

在使用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"的错误。

0
0 Comments

问题:在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"部分。

0
0 Comments

在使用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。希望这对你也有帮助。祝好运!

0