研究员:
我对这个问题感到困惑了几天,而且,到目前为止,还没有解决方案......
我正在建立一个Spring Boot网络应用程序,我希望能够做的是激活/停用我数据存储区中数据字段的加密(使用jasypt + spring + hibernate提供的工具) )通过激活/停用配置文件。因此 - 对于开发工作 - 我可以将数据字段存储为明文,而对于生产,它们将被加密。
目前,我通过一种相当不优雅的方法来做到这一点。具体来说,我在package-info.java文件中注释/取消注释代码,其中我为数据存储区域使用的类型定义了两个@TypeDefs注释块 - 其中一个被注释而另一个是活动的。因此,我当前的package-info.java文件编写如下:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Use this @TypeDefs annotation when dataencrypt configuration profile is active
//@TypeDefs({ @TypeDef(name = com.castlehillgaming.gameshare.model.Ticket.ENCRYPTED_STRING_TYPENAME, typeClass = EncryptedStringType.class, parameters = {
// @Parameter(name = "encryptorRegisteredName", value = com..evilcorp.evilproject.config.EncryptionConfig.REGISTERED_NAME) }) })
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Use this @TypeDefs annotation when dataencrypt configuration profile is not active
@TypeDefs({
@TypeDef(name = com.evilcorp.evilproject.model.Ticket.ENCRYPTED_STRING_TYPENAME, typeClass = String.class, parameters = {
@Parameter(name = "encryptorRegisteredName", value = com..evilcorp.evilproject.config.EncryptionConfig.REGISTERED_NAME) }) })
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
package com..evilcorp.evilproject.model;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
import org.jasypt.hibernate4.type.EncryptedStringType;
我的@Entity Ticket类包含以下内容:
@Entity
@EqualsAndHashCode(of = { "ticketId" })
@NoArgsConstructor(access = AccessLevel.PRIVATE, force = true)
public class Ticket implements Serializable {
...
@Column(unique = true, nullable = false)
@Type(type = ENCRYPTED_STRING_TYPENAME)
private @Getter String ticketId;
...
}
我希望我可以设计一些能让我将package-info.java文件减少到以下内容的文件:
@TypeDefs({
@TypeDef(name = com.evilcorp.evilproject.model.Ticket.ENCRYPTED_STRING_TYPENAME, typeClass = com.evilcorp.evilproject.config.MyTicketDataFieldString.class, parameters = {
@Parameter(name = "encryptorRegisteredName", value = com..evilcorp.evilproject.config.EncryptionConfig.REGISTERED_NAME) }) })
package com..evilcorp.evilproject.model;
import org.hibernate.annotations.Parameter;
import org.hibernate.annotations.TypeDef;
import org.hibernate.annotations.TypeDefs;
根据Spring Boot配置文件的状态定义两个不同版本的MyTicketDataFieldString类。例如,
@Configuration
@Profile("dataencrypt")
public class MyTicketDataFieldString extends EncryptedStringType {}
和
@Configuration
@Profile("!dataencrypt")
public class MyTicketDataFieldString implements CharSequence { ... }
其中CharSequence实现的行为类似于vanilla java.lang.String。
但是,这不会起作用,因为我必须在特定的包中定义两次相同的类。
关于如何做到这一点(或类似的东西)的任何想法都将非常感激。