java - 在 Spring Boot Hibernate 搜索中建立索引时屏蔽敏感数据

标签 java spring hibernate elasticsearch 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来执行此操作。不过,分析器方法会对查询结果产生一些影响 - 因此这取决于您的查询要求。

说实话,我很惊讶你竟然想要索引卡号。

关于java - 在 Spring Boot Hibernate 搜索中建立索引时屏蔽敏感数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51747058/

相关文章:

java - Hibernate 创建两行而不是一行

java - 如何在运行时在 Spring Boot 中重新加载嵌入式 Tomcat?

java - 没有主键的表的 Hibernate 映射

java - IBM MQ 7 文件传输

java - 后 ICS 版本中的蓝牙连接问题

java - 将对象内部的 ImageIcon 添加到另一个类中的框架

java - HttpSession 到底什么时候过期(开始有资格销毁 - 不一定销毁)?

hibernate - 两个表中 hibernate 的主键

java - 没有 session 的 Hibernate FetchType.LAZY

java - indexOf 和 BufferedReader 不适合我