首页 > 解决方案 > Spring Boot MockMVC 测试 - 启用前后注释

问题描述

我有一个(kotlin)测试,其中包含带有 Spring Boot 的代码:

@Autowired
private lateinit var context: WebApplicationContext

@Autowired
private lateinit var entityManager: EntityManager

private var mockMvc: MockMvc? = null

@Autowired
lateinit var springSecurityFilterChain: Filter

@BeforeAll
fun setup() {
    mockMvc = MockMvcBuilders
        .webAppContextSetup(context)
        .addFilters<DefaultMockMvcBuilder>(springSecurityFilterChain)
        .apply<DefaultMockMvcBuilder>(springSecurity())
        .build()
}

此方法失败并出现 401:

@PutMapping("/register")
@ResponseStatus(HttpStatus.OK)
@PreAuthorize("permitAll()")
fun registerNewUser(@Valid @RequestBody userDTO: UserDTO): User {
    val user = userDTO.toUser(passwordEncoder)
    user.activationCode = generateActivationCode()
    userRepository.save(user)
    return user
}

我不明白为什么我的前/后授权没有运行?

我在我的应用程序中定义了这些src/main/

@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
class MethodSecurityConfigurer : GlobalMethodSecurityConfiguration()

@Configuration
class SecurityConfiguration {
    @Bean
    fun getPasswordEncoder(): PasswordEncoder {
        return Pbkdf2PasswordEncoder()
    }
}

在 MockMVC 的设置中我需要做什么来启用前/后注释?

标签: springspring-bootkotlin

解决方案


所以我想通了,我想我会在这里添加答案。

这不是 MockMVC 问题,M. Deinum 是正确的,因为这两个注释都可以工作。

我的问题是这@PreAuthorize("permitAll()")是一个与“普通”弹簧安全过滤器分开的过滤器,所以我什至没有进入方法授权方面。

我配置了 Spring SecurityHttpSecurity以允许该方法,然后permitAll()开始正常工作。

http.authorizeRequests().antMatchers(HttpMethod.PUT, '/register').permitAll()

推荐阅读