因此,我尝试使用POST
登录名API
对用户进行身份验证,但问题是当用户不存在时(意味着用户名(唯一)不在数据库中),抛出的错误消息不会显示在客户端(POSTMAN
)。我尝试调试,但抛出错误,但没有显示。我看到的只是POSTMAN
中的Status: 401 Unauthorized
但是,当用户存在但密码不匹配时,它会显示正确的抛出错误消息。注意:我使用的是Spring的OAuth 2.0资源服务器JWT
控制器法
@PostMapping(path = "/login", consumes = "application/json")
public ResponseEntity<?> login(@Valid @RequestBody UserDTO userDTO) throws UsernameNotFoundException {
LOGGER.info("Authenticating {}", userDTO.getUsername());
userDTOService.confirmUser(userDTO); // Where the issue occurs
Authentication authentication = authenticationManager
.authenticate(new UsernamePasswordAuthenticationToken(userDTO.getUsername(), userDTO.getPassword()));
return ResponseEntity.ok()
.header(
HttpHeaders.AUTHORIZATION,
tokenService.generateToken(authentication)
)
.build();
}
服务方式(确认用户方式)
public void confirmUser(UserDTO userDTO) throws UsernameNotFoundException {
/*
* Check if username exist in the database
* Check if the password provided equals password in database
* */
String username = userDTO.getUsername();
String password = userDTO.getPassword();
Optional<User> user = userRepository.findUserByUserName(username);
// This error is not displayed
if (user.isEmpty()) {
LOGGER.error("User {} does not exist", username);
throw new UsernameNotFoundException(username + " does not exist");
}
boolean checkingCredentials = user
.stream()
.anyMatch(
param ->
param.getUsername().equals(username)
&&
passwordEncoder.matches(password, param.getPassword())
);
if (!checkingCredentials) {
LOGGER.error("Bad user credentials");
throw new RuntimeException("Please check username or password");
}
}
1条答案
按热度按时间k4aesqcs1#
我得到401而不是正确的错误消息的原因是因为我的方法是错误的。我有两个解决方案,但我不确定第二个是不是行业标准。
第一种方法:
1.将用户凭据传递给
UsernamePasswordToken
生成令牌。1.然后将令牌输入要进行身份验证的身份验证管理器
1.将身份验证管理器包围在TRY CATCH块中以返回异常。抛出的错误消息将由您选择。
第二种方法:
1.我想检查数据库中是否存在用户,否则引发Not Found异常
1.如果步骤1已通过,则我要检查尝试登录的用户密码和数据库中的散列密码。如果它们不匹配,我想抛出一个无效密码异常
1.如果没有抛出错误,那么我想将用户名、密码和权限传递给
UsernamePasswordAuthenticationToken()
。