java - 在 Spring Boot Hibernate Search 中进行索引时屏蔽敏感数据
问题描述
我正在使用 spring boot 2.0.2 和 hibernate search 版本 5.10.2。我有以下类作为我的实体:
@Entity
@Table(name = "CUSTOMERS")
@Indexed(index = "indexes_customer")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Beneficiary implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "ID", nullable = false)
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Basic
@Column(name = "CARD_NUMBER", length = 18)
@Field(analyze = Analyze.NO, store = Store.YES)
@SortableField
private String cardNumber;
@Basic
@Column(name = "FULL_NAME", length = 60)
@Field(analyze = Analyze.NO, store = Store.YES)
@SortableField
private String fullName;
//Getters & setters
卡片数据以纯文本形式保存,但在向前端用户显示时会被屏蔽。但是,我想在索引时屏蔽卡号。目前,我的索引如下所示:
{
"_index": "indexes_customer",
"_type": "mypackage.Customer",
"_id": "24",
"_version": 3,
"_score": 1,
"_source": {
"id": "24",
"name": "Customer Name",
"cardNumber": "1234567891011"
}
}
我希望它看起来更像这样:
{
"_index": "indexes_customer",
"_type": "mypackage.Customer",
"_id": "24",
"_version": 3,
"_score": 1,
"_source": {
"id": "24",
"name": "Customer Name",
"cardNumber": "1234******1011"
}
}
谢谢
解决方案
您可以索引任何属性,包括 @Transient 属性;这些可能包含您的自定义代码。
@Basic
@Column(name = "CARD_NUMBER", length = 18)
String getCardNumber(){ ..}
@Field(analyze = Analyze.NO, store = Store.YES, name="card_number")
@SortableField
@javax.persistence.Transient
String getIndexedCardNumber() {
return maskCardNumber( getCardNumber() );
}
或者,更复杂一点,但您可以实现自定义Analyzer
来执行此操作。不过,Analyzer 方法会对查询结果产生一些影响 - 因此它取决于您的查询要求。
老实说,我很惊讶你想要索引卡号。
推荐阅读
- tensorflow - 从源代码构建 tensorflow 时,静态单体构建是什么意思?
- swagger - 在 Swagger 中禁用/尚未实现端点
- java - 出现一个未知的登录页面
- java - 线程抛出 java.util.ConcurrentModificationException
- python - 我需要设法在触摸屏上获取用户签名
- javascript - Javascript中未定义的event.id?
- runtime-error - U-SQL 中的 E_SMS_USER_TABLEFILESDELETEDDIRECTLY 错误
- algorithm - 多源多目的地最短路径
- javascript - 在控制器中调用函数本身sails js
- node.js - 为什么当我 cat `/usr/local/bin` 中的节点目录时,它会释放 cthulhu?