准备工作
运行环境:SpringBoot、MyBatis Plus 、Maven、MySQL
ShardingSphere我用的是4.1.0版本的,导依赖:
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>4.1.0</version>
</dependency>
自定义加解密效果
对于这个功能,我的业务要求仅仅是输出时隐藏中间的内容就好了。数据库不变,存的还是真实数据。
1、对于功能,我的业务要求是数据库只有一个真实数据,取出来时候加密显示,存进数据库的是真实数据,所以我的实现方式是只对一个字段(encryptor)进行加解密。
2、官网上的配置是数据库同时存在明文和密文,我这里得到是业务升级后的,只对一个字段进行操作。
效果如图:
数据库是这样的:
自定义加解密规则
具体实现如下:
1、实现自定义解密器
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.shardingsphere.encrypt.strategy.spi.Encryptor;
import java.util.Properties;
@Getter
@Setter
public class TestShardingEncryptor implements Encryptor {
private Properties properties = new Properties();
@Override
public void init() {}
@Override
public String encrypt(final Object plaintext) {
if (null == plaintext) {
return null;
}
// return DigestUtils.sha256Hex(String.valueOf(plaintext));
// return "TEST-"+String.valueOf(plaintext);
return plaintext.toString();
}
@Override
public Object decrypt(final String ciphertext) {
String str0 ="",str1="";
str0 = ciphertext.substring(0,2);
str1 = ciphertext.substring(ciphertext.length()-2,ciphertext.length());
return str0+"****"+str1;
// return ciphertext.replaceAll("TEST-","");
}
@Override
public String getType() {
return "test";
}
}
2、创建org.apache.shardingsphere.spi.encrypt.Encryptor 文件
需要创建一个文件名为org.apache.shardingsphere.spi.encrypt.Encryptor
放入 resources 路径下的 \META-INF\services
文件的内容就是类名全称,如:
com.yourcompany.TestShardingEncryptor
3、配置使用此自定义类
Java配置模式:
如果未使用Spring Boot,需要显示用代码配置
EncryptorRuleConfiguration encryptorConfig = new EncryptorRuleConfiguration("test", props);
Spring Boot配置模式:
如果使用的是Spring Boot配置模式,则需要如下配置
spring.shardingsphere.encrypt.encryptors.encryptor_test.type=test
yaml文件这么写:
spring:
shardingsphere:
encrypt:
encryptors:
encryptor_test:
type: test
启动项目就可以了。