gpt4 book ai didi

spring-data-rest - 使用Spring Data REST进行密码编码

转载 作者:行者123 更新时间:2023-12-04 22:59:31 25 4
gpt4 key购买 nike

我应该如何使用Spring Data REST自动编码实体的已提交的纯密码字段?

我正在使用BCrypt编码器,并且当客户端通过POST,PUT和PATCH发送请求时,我想自动对请求的密码字段进行编码。

@Entity
public class User {
@NotNull
private String username;
@NotNull
private String passwordHash;
...
getters/setters/etc
...
}

首先,我尝试使用@HandleBeforeCreate和@HandleBeforeSave事件监听器解决问题,但是其参数中的User已经合并,因此我无法在User的新密码或旧的passwordHash之间进行任何区别:
@HandleBeforeSave
protected void onBeforeSave(User user) {
if (user.getPassword() != null) {
account.setPassword(passwordEncoder.encode(account.getPassword()));
}
super.onBeforeSave(account);
}

可以在setter方法上使用@Projection和SpEL吗?

最佳答案

您可以实现Jackson JsonDeserializer:

public class BCryptPasswordDeserializer extends JsonDeserializer<String> {

public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String encodedPassword = encoder.encode(node.asText());
return encodedPassword;
}
}

并将其应用于您的JPA Entity属性:
// The value of the password will always have a length of 
// 60 thanks to BCrypt
@Size(min = 60, max = 60)
@Column(name="password", nullable = false, length = 60)
@JsonDeserialize(using = BCryptPasswordDeserializer.class )
private String password;

关于spring-data-rest - 使用Spring Data REST进行密码编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com