使用Spring框架验证用户时未显示错误消息

m3eecexj  于 2022-10-23  发布在  Spring
关注(0)|答案(1)|浏览(173)

因此,我尝试使用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");
        }

    }
k4aesqcs

k4aesqcs1#

我得到401而不是正确的错误消息的原因是因为我的方法是错误的。我有两个解决方案,但我不确定第二个是不是行业标准。
第一种方法:
1.将用户凭据传递给UsernamePasswordToken生成令牌。
1.然后将令牌输入要进行身份验证的身份验证管理器
1.将身份验证管理器包围在TRY CATCH块中以返回异常。抛出的错误消息将由您选择。
第二种方法:
1.我想检查数据库中是否存在用户,否则引发Not Found异常
1.如果步骤1已通过,则我要检查尝试登录的用户密码和数据库中的散列密码。如果它们不匹配,我想抛出一个无效密码异常
1.如果没有抛出错误,那么我想将用户名、密码和权限传递给UsernamePasswordAuthenticationToken()

相关问题