首页
学习
活动
专区
圈层
工具
发布

Spring @WebMvcTest with Spring Security

基础概念

@WebMvcTest 是 Spring Boot 提供的一个测试注解,用于对 Spring MVC 控制器层进行单元测试。它会自动配置 MockMvc 实例,并加载指定的控制器类及其依赖的组件,但不会加载整个 Spring 应用上下文。

Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于保护基于 Spring 的应用程序。

相关优势

  1. 专注控制器层测试@WebMvcTest 允许你专注于控制器层的测试,而不必加载整个应用上下文,从而提高测试速度。
  2. MockMvc 支持:通过 MockMvc,你可以模拟 HTTP 请求并验证响应,而无需实际启动服务器。
  3. 与 Spring Security 集成:结合 Spring Security,你可以轻松测试安全相关的功能,如身份验证和授权。

类型

@WebMvcTest 主要有以下几种类型:

  • 默认情况下,只加载控制器类及其直接依赖。
  • 通过 excludeFiltersincludeFilters 属性,可以进一步自定义要加载或排除的组件。
  • 可以与 @MockBean@SpyBean 注解结合使用,以模拟或监视其他 Spring Bean。

应用场景

当你需要测试以下场景时,可以使用 @WebMvcTest

  1. 验证控制器的响应是否符合预期。
  2. 测试控制器与 Spring Security 的集成,如验证用户权限。
  3. 在不启动整个应用的情况下,模拟各种 HTTP 请求和响应。

遇到的问题及解决方法

问题:@WebMvcTest 无法加载 Spring Security 配置

原因@WebMvcTest 默认不会加载整个 Spring 应用上下文,因此可能无法找到 Spring Security 的配置。

解决方法

  1. 使用 @Import 注解显式导入 Spring Security 配置类。
  2. 在测试类上使用 @ContextConfiguration 注解,并指定 Spring Security 配置类的位置。
代码语言:txt
复制
@WebMvcTest(controllers = MyController.class)
@Import(SecurityConfig.class) // 导入 Spring Security 配置类
public class MyControllerTest {
    // ...
}

或者

代码语言:txt
复制
@WebMvcTest(controllers = MyController.class)
@ContextConfiguration(classes = {MyController.class, SecurityConfig.class})
public class MyControllerTest {
    // ...
}

问题:MockMvc 请求被 Spring Security 拦截

原因:Spring Security 可能会拦截 MockMvc 发出的请求,并根据安全配置进行身份验证或授权。

解决方法

  1. 在测试方法上使用 @WithMockUser 注解,模拟一个已认证的用户。
  2. 配置 Spring Security 允许匿名访问测试所需的 URL。
代码语言:txt
复制
@WebMvcTest(controllers = MyController.class)
public class MyControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    @WithMockUser(username = "test", roles = "USER")
    public void testMyController() throws Exception {
        mockMvc.perform(get("/my-endpoint"))
                .andExpect(status().isOk());
    }
}

或者在 Spring Security 配置中添加允许匿名访问的规则:

代码语言:txt
复制
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/my-endpoint").permitAll() // 允许匿名访问 /my-endpoint
            .anyRequest().authenticated();
    }
}

参考链接

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Spring Security】001-Spring Security框架概述、Spring Security入门案例

一、Spring Security框架概述 1、概述 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。...Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案; 2、核心功能 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制),一般来说...,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是 Spring Security 重要核心功能; 3、用户认证 用户认证指的是...通俗点讲就是系统判断用户是否有权限去做某些事情; 5、Spring Security 与 Shiro Spring Security: 概述: Spring Security是Spring 技术栈的组成部分...Boot/Spring Cloud + Spring Security; 注意:以上只是一个推荐的组合而已,如果单纯从技术上来说,无论怎么组合,都是可以运行的; 二、Spring Security

92911
  • Spring Security

    一、简介 Spring Security是一个高度自定义的安全框架。利用Spring IoC/DI和AOP功能,为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作。...启动项目,Spring Security默认就开启了,此时访问localhost:8080/index就会被Spring Security拦截,跳转到内置的登录页面要求登录。...如果我们不希望使用默认的用户密码,可以在配置文件中指定一个,如此Spring Security就会使用我们指定的,而不会使用默认的了。...spring.security.user.name=zhangxun spring.security.user.password=123123 三、自定义认证逻辑 当我们开启自定义认证逻辑后,上面的默认用户和配置文件中的用户就不生效了...以上是关于Spring Security的基本使用方法,使用数据库及其它特性将会在后面的文章中予以说明。 七、会话管理 在以上例子中,认证和授权都是Spring Security自动进行的。

    2.6K00

    Spring Boot 集成 Spring Security

    一、Spring Security 简介 Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。...二、集成 Spring Security 本项目所使用的开发环境及主要框架版本: java version “1.8.0_144” spring boot 2.2.0.RELEASE spring security...除了设置用户和密码之外,我们还可以设置默认用户的角色,比如: #设置Spring Security默认的用户名、密码和角色 spring.security.user.name=semlinker spring.security.user.password...=123456 spring.security.user.roles=admin Spring Security 是一款灵活、功能强大的安全框架。...至此为止,本文的主要内容都已经介绍完了,后续本人还会继续发布 Spring Security 相关文章,感兴趣的小伙伴请继续关注本人的 Spring Security 专题哟。

    3.8K10

    Spring Security源码分析二:Spring Security授权过程

    Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。...它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入...前言 本文是接上一章Spring Security源码分析一:Spring Security认证过程进一步分析Spring Security用户名密码登录授权是如何实现得; 类图 ?...Security则为当前的SecurityContextHolder中添加一个Authenticaiton 的匿名实现类AnonymousAuthenticationToken; public void...Spring Security默认使用AffirmativeBased实现 AccessDecisionManager 的 decide 方法来实现授权 public void decide(Authentication

    1.5K21

    Spring Security安全

    安全 引入Spring Security org.springframework.boot spring-boot-starter-security... 如果添加了Spring Security的依赖,那么web应用默认对所有的HTTP路径(也称为终点,端点,表示API的具体网址)使用’basic’...默认的AuthenticationManager只有一个用户('user’的用户名和随机密码会在应用启动时以INFO日志级别打印出来),如下: Using default security password...对登录的用户名/密码进行配置,有三种不同的方式: 在 application.properties 中进行配置 通过 Java 代码配置在内存中 通过 Java 从数据库中加载 在配置文件中配置: spring.security.user.name...=javaboy spring.security.user.password=123 Java 配置用户名/密码 @Configuration public class SecurityConfig extends

    1.1K31

    Spring Security入门1:Spring Security的定义与用途

    这有助于防止恶意行为和不当使用系统,本文讲解了安全性问题的解决方案之一:Spring Security,探讨Spring Security的定义与用途。...二、Spring Security 的定义 2.1 Spring Security 和 Spring 的关系 Spring Security 是基于 Spring 框架的安全性解决方案,它提供了一套强大的认证和授权机制...Spring Security 与 Spring 框架紧密集成,为Spring应用程序提供了全面的安全性功能。...四、Spring Security 的整合和使用 在 Spring Boot 项目中整合 Spring Security 框架相对简单,以下是整合步骤的概述,请同学们认真学习。...4.1 添加Spring Security依赖 在项目的 pom.xml 文件中添加 Spring Security 的依赖。

    1.4K40
    领券