当前位置: 首页 > 面试题库 >

在需要身份验证的控制器上运行单元测试

欧阳乐生
2023-03-14
问题内容

我有一个Spring
Boot应用程序,需要登录才能执行某些操作。我正在尝试使用进行测试MockMvc,但似乎无法正常工作。我不断收到状态为403(禁止)的HTTP响应。验证部分可能有问题。

我尝试按照文档进行操作,但是无法使其正常运行。

这是我当前的测试代码:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = {Application.class})
@WebIntegrationTest("server.port = 8093")
public class PasswordChangeTests {
    @Autowired
    private EmbeddedWebApplicationContext webApplicationContext;

    @Autowired
    private UserRepository userRepository;

    private MockMvc mockMvc;

    @Before
    public void setUp() throws Exception {
        this.mockMvc = MockMvcBuilders
                .webAppContextSetup(webApplicationContext)
                .apply(springSecurity())
                .build();
    }

     @Test
     public void changePasswordWorks() throws Exception {
         // Send password change request
         PasswordChangeRepresentation passwordChange = new PasswordChangeRepresentation(DefaultUsers.Admin.getPassword(), "12345678");
         mockMvc.perform(MockMvcRequestBuilders.request(HttpMethod.POST, "/password/change")
                 .content(new ObjectMapper().writeValueAsString(passwordChange))
                 .contentType(MediaType.APPLICATION_JSON)
                 .accept(MediaType.APPLICATION_JSON))
                 .andExpect(status().isOk());

         // Check that the password has been changed
         User user = this.userRepository.findByUsername(DefaultUsers.Admin.getEmail());
         Assert.assertEquals(user.getPassword(), "12345678");
    }
}

抱歉,如果我缺少明显的内容。这是我第一次使用Spring Boot。


问题答案:

您需要指定要以哪个用户身份运行测试。您有几个选项(每个选项都是详细文档的链接):

@WithMockUser

此选项将创建一个伪造的用户(即该用户不必存在于数据存储中)。这种方法的问题是,如果您的应用程序依赖于自定义的User实现,则可能会得到类强制转换异常。如果您没有从自定义UserDetailsS​​ervice返回自定义类型,则此解决方案应该可以正常工作。

 @Test
 @WithMockUser(username="admin",roles={"USER","ADMIN"})
 public void changePasswordWorks() throws Exception {

@WithUserDetails

如果您实现了返回UserDetails的自定义实现的自定义UserDetailsS​​ervice,则此解决方案可能对您有用。

为了使其正常工作,您需要将UserDetailsS​​ervice公开为Bean,并且该用户必须存在。例如:

 @Test
 @WithUserDetails("admin")
 public void changePasswordWorks() throws Exception {

@WithSecurityContext

这是两全其美的做法,但需要一些额外的设置。如果您具有返回UserDetails的自定义实现的自定义UserDetailsS​​ervice,并且不希望用户必须存在,则可以使用此方法。我将让您阅读有关此设置的文档,因为该文档冗长且文档齐全。

使用RequestPostProcessor

如果注释不是您的事,则可以使用RequestPostProcessor。例如:

import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.*;

 ...

 @Test
 public void changePasswordWorks() throws Exception {
     // Send password change request
     PasswordChangeRepresentation passwordChange = new PasswordChangeRepresentation(DefaultUsers.Admin.getPassword(), "12345678");
     mockMvc.perform(MockMvcRequestBuilders.request(HttpMethod.POST, "/password/change")

             // ADD this line
             .with(user("admin").roles("USER","ADMIN"))

             .content(new ObjectMapper().writeValueAsString(passwordChange))
             .contentType(MediaType.APPLICATION_JSON)
             .accept(MediaType.APPLICATION_JSON))
             .andExpect(status().isOk());

     // Check that the password has been changed
     User user = this.userRepository.findByUsername(DefaultUsers.Admin.getEmail());
     Assert.assertEquals(user.getPassword(), "12345678");
}


 类似资料:
  • 我们正在尝试做一些具有登录屏幕的网站。但是我们有一个问题。我们的域是本地主机/登录/用户。但是,如果用户进入localhost/Home/Index,他/她无需登录即可访问我们的主站点。因此,我们将 [授权] 写入索引控制器。但我不知道我必须使用什么。我是否必须在我们的项目中使用AuthorizeAttribute? 如何访问LoginController/Authentication函数中的索引

  • 问题内容: 我收到错误 NOAUTH必需的身份验证 。我的laravel版本是5.3,我正在使用predis 1.1.1连接redis。 在etc / redis / redis.conf中,我有: 在.env文件中 在config / database.php中,我有: 我通过以下方式连接redis: 并像这样使用它: 因此,当我注释掉并将密码发送为null时,它可以工作,但在密码到位后却无法工

  • 我们正在开发一个iOS应用程序,它使用谷歌来验证firebase。根据https://www . Firebase . com/docs/IOs/guide/user-auth . html # section-log in Firebase说,auth令牌每24小时过期一次。我们想知道以下场景是否是我们需要考虑的: 用户通过Google和Firebase进行身份验证 我们的应用程序将获得一个24

  • 问题内容: 我在 需要身份验证的服务上运行Google Cloud的CORS相关问题。 如果我尝试通过带有Bearer令牌的cli执行curl命令,则 一切正常。不幸的是,如果我尝试通过javascript中的ajax执行相同的调用,则会 收到403。 云运行日志中的错误是这样的: 容器永远不会被击中。 我看到的问题是,当我在Web 浏览器中使用Ajax拨打电话时。Web浏览器正在发出飞行前请求(

  • 我遵循了GitHub教程中的所有内容:https://help.github.com/articles/generating-ssh-keys 我在存储库的目录中执行了所有命令。我成功到达教程的末尾,并收到消息:“嗨,用户名!你已成功通过身份验证,但 GitHub 不提供外壳访问。 然而,当我尝试做推送之类的事情时,它仍然要求输入我的用户名和密码。

  • 我正在Cakephp应用程序中实现身份验证。 在该应用程序中,我按照以下教程开始实现身份验证:简单身份验证和授权应用程序,但此教程需要发送验证电子邮件,不知道为什么。这是我的代码: 用户模型: 应用控制器 用户控制器 表结构: 此解决方案需要电子邮件验证,但我想禁用电子邮件验证。怎样基本上,我需要对上述代码进行哪些更改才能拥有具有以下功能的简单身份验证系统: 无需访问控制

  • Dropwizard是否也支持摘要验证?我只找到了基本的身份验证和OAuth。这方面的示例代码会很好。 null

  • 它总是导致带有错误消息的catch块 登录失败:未知的用户名或错误的密码。失败:未知的用户名或错误的密码。 我确信给定的密码是正确的。 如何使用给定的密码验证用户名?