Проблема
Мне нужно хешировать пароль пользователя на уровне сущности (не на уровне контроллера), и @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, прослушиватели вызываются после запроса