Jpa @Converter получить идентификатор объекта - PullRequest
0 голосов
/ 04 октября 2018

Проблема

Мне нужно хешировать пароль пользователя на уровне сущности (не на уровне контроллера), и @Converter кажется правильным выбором, с JavaEE, без пружины.

Покажите мне код

Вот код, использующий Jpa AttributeConverter:

import java.nio.charset.StandardCharsets;

import javax.inject.Inject;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.hash.Hashing;

@Converter
public class JPACryptoConverter implements AttributeConverter<String, String> {

    private static Logger logger = LoggerFactory.getLogger(JPACryptoConverter.class);

    private String salt = "helloWorld";

    @Inject
    private UserRepository userRepository;

    @Override
    public String convertToDatabaseColumn(String sensitive) {
        return Hashing.sha512().hashString(salt + sensitive, StandardCharsets.UTF_8).toString();
    }

    @Override
    public String convertToEntityAttribute(String sensitive) {
        String tmp = Hashing.sha512().hashUnencodedChars(sensitive).toString();
        return tmp.substring(0, salt.length());
    }
}

Я хочу заменить солт-строку на соль, определенную сущностью в пользовательской таблице, но какполучить эту информацию?

Чтобы получить эту информацию, мне нужно получить доступ к userRepository с помощью идентификатора объекта и получить соль, есть ли способ найти эту информацию с помощью @Converter?

Примечание. Я пытался использовать прослушиватели жизненного цикла, preload, preupdate, prepersist, но поскольку я использую критерии jpa, прослушиватели вызываются после запроса

Ответы [ 2 ]

0 голосов
/ 04 октября 2018

Если это для аутентификации в SpringBoot, то вы должны использовать WebSecurityConfigurereAdapter и реализовать метод configure.и есть что-то вроде этого:

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(userDetailsServiceImpl).passwordEncoder(passwordEncoder());
}

private PasswordEncoder passwordEncoder() {

    return new PasswordEncoder() {
        @Override
        public String encode(CharSequence charSequence) {
            return charSequence.toString();
        }

        @Override
        public boolean matches(CharSequence charSequence, String s) {
            return charSequence.toString().equals(s);
        }
    };
}
0 голосов
/ 04 октября 2018

Я не знаю точно, что вы хотите, вы хотите хэшировать pw пользователя перед сохранением в db?Вы создаете конвертер и хотите его использовать?что-то сделать, это добавить @Convert (converter = JPACryptoConverter.class)

@Entity
class UserEntity {

    @Column(name = "pw")
    @Convert(converter = JPACryptoConverter.class)
    private String pw;
}

И, пожалуйста, удалите @Converter из вашего JPACryptoConverter.Это просто:

public class JPACryptoConverter implements AttributeConverter<String, String>...

не:

@Converter
public class JPACryptoConverter implements AttributeConverter<String, String>...

//To using Strong pw hash 
public static String hash(String plainPassword) {
    if (StringUtils.isBlank(plainPassword)) {
        throw new EmptyPasswordException("Password could not be empty");
    }
    return BCrypt.hashpw(plainPassword, BCrypt.gensalt());
}

public static boolean checkPassword(String plainPassword, String hash) {
    return BCrypt.checkpw(plainPassword, hash);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...