没有csrf或无效csrf的mockmvc post请求未失败

pbossiut  于 2021-09-29  发布在  Java
关注(0)|答案(1)|浏览(372)

我有一个带有SpringSecurity5的SpringBoot-2.5.1应用程序。
WebSecurity配置如下所示:

@Slf4j
@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    private final CustomProperties customProperties;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        if (customProperties.isEnabled()) {
            log.info("authentication enabled.");
            http.authorizeRequests()
                    .anyRequest()
                    .authenticated()
                    .and()
                    .oauth2Login()
                    .redirectionEndpoint()
                    .baseUri(customProperties.getAuthorizationResponseUri())
                    .and()
                    .userInfoEndpoint(userInfo -> userInfo.userService(new CustomOAuth2UserService()::loadUser));
        } else {
            log.info("authentication disabled.");
            http.authorizeRequests()
                    .anyRequest()
                    .permitAll();
        }
    }

    public void configure(WebSecurity webSecurity) {
        webSecurity.ignoring()
                .antMatchers("/actuator/info", "/actuator/health/*");
    }
}
}

控制器如下所示:

@Controller
@RequiredArgsConstructor
public class UserController {

    private final UserService userService;

    @PostMapping("/users")
    public @ResponseBody Mono<Map<String, String>> saveUsers(@RequestBody List<UserDto> userDtos) {
        return userService.saveUser(userDtos);
    }
}

与上述控制器对应的junit:

@AutoConfigureMockMvc
@WebMvcTest(UserController.class)
class UserControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private  UserService userService;

        @SneakyThrows
        @Test
        @WithMockTestUser
        void shouldSaveUsers() {
            var userDtos = "...";

            mockMvc.perform(post("/users")
                    .contentType(APPLICATION_JSON)
                    .content(userDtos))
                    .andDo(print())
                    .andExpect(status().isOk());
        }
    }

上面没有csrf的junit将状态设置为ok,而不是禁止请求。若我调试,我可以看到,若csrf()并没有包含,那个么就不会生成任何令牌并将其分配给请求。然而,请求仍在通过。理想情况下,它应该抛出禁止的请求访问。
即使使用csrf(),我也可以看到令牌被生成并分配给参数。
在这两种情况下,无论post请求是否包含csrf令牌,我都看不到使用mockmvc验证post请求的任何地方。
mockmvc是否需要任何额外的配置来验证post请求是否包含csrf?

zqry0prt

zqry0prt1#

而不是自动配置 MockMvc ,你需要建立 MockMvc 使用 SecurityMockMvcConfigurers.springSecurity() .
这将添加名为“springsecurityfilterchain”的Springbean作为过滤器,并确保 TestSecurityContextHolder 对每个请求都使用。

@Autowired
private WebApplicationContext context;

private MockMvc mockMvc;

@Before
public void setup() {
    this.mockMvc = MockMvcBuilders
            .webAppContextSetup(this.context)
            .apply(springSecurity())
            .build();
}

相关问题