You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

测试RestController时遇意外401错误:登录接口返回未授权

登录接口返回401未授权,但用户已成功注册的问题

我尝试通过注册用户来测试登录方法,调用/login接口时未获得预期的200响应,反而返回401 UNAUTHORIZED状态。测试中已确认用户注册成功,但请求登录接口仍返回401未授权。

UserController代码

/**
 * Login form
 * @param user the user we are trying to log in with
 * @return JWT
 */
@PostMapping("/login")
public String login(@RequestBody User user){
    System.out.println(user);
    return userService.login(user);
}

测试用例代码

@Test
@DisplayName("Should Login Successful")
public void shouldLoginSuccessful() throws Exception {               
    User user = new User( VALID_USERNAME_EXAMPLE, VALID_PASSWORD_INPUT_EXAMPLE ); 
    assertDoesNotThrow(() -> userService.register(user));
    assertFalse(userRepository.findAll().isEmpty()); // Verify the list is not empty
    assertEquals(1, userRepository.findAll().size()); // Verify there is just one user


    String userJson = objectMapper.writeValueAsString(user);

    mockMvc.perform(MockMvcRequestBuilders
                    .post("/login")
                    .contentType(MediaType.APPLICATION_JSON)
                    .content(userJson)) // Attach the JSON payload
            .andExpect(status().isOk());
}

排查方向

  • 检查userService.login(user)的密码验证逻辑:注册时若对密码进行了加密(比如BCrypt),登录时必须使用相同的加密方式校验,不能直接明文对比,否则会验证失败返回401。
  • 确认JSON序列化/反序列化的字段一致性:测试用例中User对象序列化为JSON后,字段名(如username、password)是否和User实体类的字段名完全匹配,避免因字段不匹配导致接口无法正确获取登录凭证。
  • 检查Spring Security配置:确认/login接口是否被错误设置了权限拦截,若要求提前认证才能访问登录接口,会直接导致未授权请求返回401。
  • 日志排查验证流程:在userService.login方法中添加日志,输出传入的用户信息、数据库中存储的用户信息以及验证结果,确认是否在验证环节出现失败。
  • 核对注册后的用户数据:查看数据库中存储的用户密码(若明文存储)是否与测试用例中的一致,或者加密后的密码是否能被登录逻辑正确解析。

内容的提问来源于stack exchange,提问作者Marius Carchilan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:44:58