Spring 5中csrf()方法所属包是哪个?测试如何避免CSRF 403错误
解决Spring 5集成测试CSRF配置报错403的方案
方案1:导入对应依赖复用原有csrf()方法(优先推荐)
org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors类并未在Spring 5中被移除,它属于独立的spring-security-test模块,需要显式引入测试依赖:
- Maven 配置(pom.xml):
<dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <version>与项目使用的Spring Security版本保持一致</version> <scope>test</scope> </dependency>
- Gradle 配置:
testImplementation 'org.springframework.security:spring-security-test:<你的Spring Security版本号>'
依赖导入完成后即可正常静态导入方法使用,原有测试代码无需修改:
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
方案2:测试环境临时关闭CSRF校验
如果你的接口是服务端对接类接口,本身不需要CSRF防护,可以在测试专属的安全配置中关闭CSRF,无需调整测试请求代码:
@Configuration @EnableWebSecurity public class TestSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { // 保留原有其他安全配置,仅关闭CSRF校验 http.csrf(csrf -> csrf.disable()); return http.build(); } }
在测试类上添加@Import(TestSecurityConfig.class)引入该配置即可。
注意:该方案仅建议在测试环境或确认业务无CSRF风险时使用,生产环境开启CSRF可防范跨站请求伪造攻击。
方案3:手动携带CSRF Token发起请求
如果不想引入额外依赖也不想修改安全配置,可以手动生成并携带合法CSRF Token:
// 生成合法CSRF Token CsrfToken csrfToken = new HttpSessionCsrfTokenRepository().generateToken(null); mockMvc.perform( post("/my_endpoint") .contentType(MediaType.APPLICATION_JSON) .header("Authorization", my_credentials) // 携带CSRF Token请求头 .header(csrfToken.getHeaderName(), csrfToken.getToken()) .content(jsonPayload) ) .andExpect(status().isOk());
内容的提问来源于stack exchange,提问作者Alex Vergara
相关产品推荐
相关产品推荐

