Невозможно обновить объект пользователя в DaoAuthenticationProvider - PullRequest
0 голосов
/ 26 апреля 2019

Я могу получить свой пользовательский dao в реализации DaoAuthenticationProvider, но я не могу обновить тот же объект. Я хочу увеличить число неудачных попыток доступа при неудачных входах в систему, но в результате Spring выдает исключение.

Я попытался автоматически подключить менеджер сущностей и создать транзакцию независимо, сохранив объект пользователя, но безрезультатно.

Вот соответствующий вызов метода сервиса:

public void resetPassowrdAttempts(CorAclUser user) {
    user.setAccessfailedcount(BigDecimal.valueOf(1));
    userRepository.save(user); //Exception here
}

Вот переопределенный метод в провайдере аутентификации DAO. Я не переопределил другие методы.

protected void additionalAuthenticationChecks(UserDetails userDetails,UsernamePasswordAuthenticationToken authentication){
    CorAclUser aclUser =  aclUserRepository.findById_UsernameAndId_UserTenantCode(userDetails.getUsername(),Constants.TENANT_CODE).orElseThrow( 
            () -> new UsernameNotFoundException("Invalid username or password."));
    if(!aclUser.getActiveFlag())
        throw new NotFoundException(ExceptionResponseCodes.USER_NOT_FOUND, "User is deactivated");
    if(userDetails.getAuthorities()!=null) {
        if(verifyHash(authentication.getCredentials().toString(),aclUser.getPasswordhash()) ) {
            userService.resetPassowrdAttempts(aclUser);
        }else {
            throw new BadCredentialsException("Password is incorrect!");
        }
    }else {
        throw new BadCredentialsException("user does not have any privileges");
    }
}

Вот журнал ошибок:

[ate.internal.ExceptionMapperStandardImpl]: HHH000346: ошибка во время управляемого сброса [org.springframework.security.core.userdetails.User не может быть приведен к com.tlx.configurations.security.CustomUserDetails]

Ошибка обработки: TransactionSystemException, не удалось зафиксировать транзакцию JPA; Вложенное исключение - javax.persistence.RollbackException: ошибка при фиксации транзакции

Решено [org.springframework.transaction.TransactionSystemException: Не удалось зафиксировать транзакцию JPA; вложенное исключение: javax.persistence.RollbackException: ошибка при фиксации транзакции]

1 Ответ

0 голосов
/ 29 апреля 2019

Это ожидаемое поведение. Вы можете обновить счетчик неудачных попыток входа в систему в блоке catch. Вот пример кода для вас:

    try {
        // Perform the actual authentication.
        super.additionalAuthenticationChecks(userDetails, authentication);

        // Reset login attempts number on successful login.
        user.setLoginAttemptsNumber(0);
    } catch (final BadCredentialsException e) {
        // Increase the number of unsuccessful attempts.
        user.setLoginAttemptsNumber(user.getLoginAttemptsNumber() + 1);

        if (user.getLoginAttemptsNumber() < maxLoginAttemptsNumber - 1) {
            throw new BadCredentialsException(String.format("Incorrect username or password. Attempt %d of %d.",
                                                            user.getLoginAttemptsNumber(), maxLoginAttemptsNumber), e);
        }
    } finally {
        userDao.save(user);
    }
...