测试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
相关产品推荐
相关产品推荐

