当前位置: 首页 > 知识库问答 >
问题:

Spring Security单元测试-MockMvc使用自定义用户执行测试

郗欣嘉
2023-03-14

我正在为我的Spring MVC控制器设置单元测试,并试图利用Spring MVC测试框架。对于控制器中的每个endpoint,我希望确保只有具有指定权限的用户才能访问。我的问题是,在使用mockMvc工具解决这个问题时,我使用了一个自定义用户实现,并获得了类强制转换异常。

对于每个请求,我希望它看起来像这样:

 mockMvc.perform(MockMvcRequestBuilders.get(path).with(user("user").authorities(authorities)))
                .andExpect(status().isOk())
                .andExpect(authenticated().withUsername("user"));

我想以某种方式调整上述语句,以指定我的自定义用户主体。请参见下面Spring的用户方法。我的第一个想法是重写类UserRequestPostProcessor,并对其进行调整,使其使用我的自定义用户类型,而不是标准的Spring Security用户,但该类被声明为final,不能被子类化。是否支持覆盖默认行为并使用自定义用户类型??

public static UserRequestPostProcessor user(String username) {
        return new UserRequestPostProcessor(username);
}

据我所见,我是一个用@WithSecurity Context注释测试的候选者,这样我就可以在身份验证中设置自定义用户主体。我在这里担心的是,我将被限制为测试每个方法的一个用户,这与我正在尝试做的事情无关。

如何测试多个自定义用户发出的请求?

共有1个答案

唐俊楚
2023-03-14

我学会了两种方法:

>

我可以完全删除用户方法,并传入已使用自定义用户主体设置的身份验证。

我选择了后者。

protected void performTest(HttpMethod method, String path, Object[] pathVariables, UserRoleEnum role,
        boolean expectAllowed) throws Exception {
    mockMvc.perform(buildRequest(method, path, pathVariables).with(authentication(createAuthentication(role))))
            .andExpect(expectAllowed ? status().isNotFound() : status().isForbidden())
            .andExpect(authenticated().withUsername("user"));
}

注意,buildRequestcreateAuthentication方法是我创建的助手方法,而所有其他方法都是由Spring提供的。helper方法分别返回MockHttpServletRequestBuilderAuthentication

 类似资料:
  • 我已经创建了一个自定义弹性搜索客户端。我需要在各种功能上部署单元测试。我该怎么做呢? 下面是我的客户提供的一个方法。我应该如何在这里部署单元测试? 我该如何着手做这件事呢?

  • 我想为类“ImageController”创建单元测试。由于映像必须由创建的用户拥有,所以我希望在执行单元测试之前创建一个用户(使用@before)。如何创建此用户?在测试UserController本身时,我做了如下操作:

  • 问题内容: 我已Spring Boot启用基本身份验证的应用程序。从数据库消耗。为了进行单元测试,我想对其进行模拟,以便从其他地方使用数据。 我该怎么做? 我的问题不是如何模拟自身,而是如何模拟使用它来通过基本身份验证测试Controller的方式。 以下是我的SpringSecurity配置: 总之,我怎么能嘲笑UserServiceDetails到SpringSecurity配置,所以我能单元

  • 在使用maven运行单元测试时,我遇到了这个异常。我的所有测试都没有执行。我的测试类的格式是 我正在运行以下命令来运行此命令: 使用的surefire插件是: 有人知道为什么我的测试没有执行吗?我用的是jUnit 4.8.2和surefire 2.14.1

  • 我有一个只能从特定IP地址调用的Web应用程序。除此之外,不需要身份验证或授权;如果您来自正确的IP,您可以看到一切。 为此,在搜索StackOverflow和其他地方时,我发现了一些在Spring Security中按IP地址过滤请求的建议。它们都采用这种形式(使用java配置扩展WebSecurity配置适配器): 然而,这对我来说从来都不起作用;它从不拒绝任何请求,无论我从哪个IP地址发出请

  • Spring对MockMvc有2个设置: 独立设置 WebApplication Context安装 一般来说,MockMvc用于哪种测试?单元还是集成?或者两者兼而有之? 使用独立设置(运行在Spring应用程序上下文之外)允许您编写单元测试,而使用WebApplication Context设置您可以编写集成测试,这是对的吗?