AuthenticationException выбрасывает с правильными учетными данными - PullRequest
1 голос
/ 12 марта 2019

Я пытаюсь защитить REST API с помощью JWT, и у меня возникает проблема при входе.

UserService.java

private final UserRepository repository;
private final PasswordEncoder passwordEncoder;
private final JwtTokenProvider jwtTokenProvider;
private final AuthenticationManager authenticationManager;

@Autowired
public UserService(UserRepository repository, PasswordEncoder passwordEncoder,
                   JwtTokenProvider jwtTokenProvider, AuthenticationManager authenticationManager) {
    this.repository = repository;
    this.passwordEncoder = passwordEncoder;
    this.jwtTokenProvider = jwtTokenProvider;
    this.authenticationManager = authenticationManager;
}

public String signin(String email, String password) {
    try {

        UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(email, password);
        authenticationManager.authenticate(token);
        return jwtTokenProvider.createToken(email, Collections.singletonList(ROLE_CLIENT));
    } catch (AuthenticationException e) {
        throw new CustomException("Invalid email/password supplied", HttpStatus.UNPROCESSABLE_ENTITY);
    }
}

public String signup(UsersEntity user) {
    if (!repository.existsByEmail(user.getEmail())) {
        user.setPassword(passwordEncoder.encode(user.getPassword()));

        repository.save(user);
        return jwtTokenProvider.createToken(user.getEmail(), Collections.singletonList(ROLE_CLIENT));
    } else {
        throw new CustomException("Email is already in use", HttpStatus.UNPROCESSABLE_ENTITY);
    }
}

Он успешно регистрирует пользователя, но когдаЯ пытаюсь войти, он всегда выдает AuthenticationException на authenticationManager.authenticate(token);.

Что я делаю не так?

Полная трассировка стека

1 Ответ

0 голосов
/ 13 марта 2019

Согласно предоставленным вами трассировкам стека, BadCredentialsException генерируется методом additionalAuthenticationChecks из класса DaoAuthenticationProvider. Либо предоставленный вами токен аутентификации является нулевым, либо представленный пароль, извлеченный из этого токена аутентификации, не совпадает с паролем, возвращаемым методом getPassword объекта userDetails.

protected void additionalAuthenticationChecks(UserDetails userDetails,
        UsernamePasswordAuthenticationToken authentication)
        throws AuthenticationException {
    if (authentication.getCredentials() == null) {
        logger.debug("Authentication failed: no credentials provided");

        throw new BadCredentialsException(messages.getMessage(
                "AbstractUserDetailsAuthenticationProvider.badCredentials",
                "Bad credentials"));
    }

    String presentedPassword = authentication.getCredentials().toString();

    if (!passwordEncoder.matches(presentedPassword, userDetails.getPassword())) {
        logger.debug("Authentication failed: password does not match stored value");

        throw new BadCredentialsException(messages.getMessage(
                "AbstractUserDetailsAuthenticationProvider.badCredentials",
                "Bad credentials"));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...