1 Star 6 Fork 7

spring/mybatis-interceptor-demo

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

1. 注解说明

​ 作用:在数据入库时进行加密,在数据出库时进行解密,不明文存储数据,增强数据的安全性。

@CryptEntity

​ 该注解仅能修饰接口、类、枚举。

​ 该注解在使用Mybatis进行增删改查时生效,不影响数据在Controller和Service中进行业务逻辑处理。

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface CryptEntity {
}

@CryptField

​ 该注解仅能修饰成员变量。

​ 该注解在使用Mybatis进行增删改查时生效,不影响数据在Controller和Service中进行业务逻辑处理。

@Documented
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface CryptField {
    /**
     * 加密枚举类型:AES/Base64 ...
     */
    EncryptTypeEnum type();
}

2. 注解使用

​ @CryptEntity注解修饰类,@CryptField注解修饰成员变量同时需指定数据加密类型,当前支持对称Base64加解密。

​ @CryptEntity和@CryptField必须一起使用功能才生效。

@CryptEntity
public class DataMasking implements Serializable {
    /**
     * base64加解密
     */
    @CryptField(type = EncryptTypeEnum.BASE64)
    @ApiModelProperty("base64加解密")
    @TableField(value = "base64")
    private String base64;

    /**
     * 对称加密
     */
    @CryptField(type = EncryptTypeEnum.AES)
    @ApiModelProperty("对称加密")
    private String sea;
}

3. 拓展

​ 支持拓展加密类型,具体步骤如下:

​ ①添加枚举类型

/**
 * 加密类型枚举
 **/
public enum EncryptTypeEnum {
    /**
     * AES加密
     */
    AES,
    /**
     * base64加密
     */
    BASE64,
     /**
     * xxxx加密
     */
    xxxx,
    
}

​ ②实现Crypt接口,重写加密解密方法

/**
 * 加密算法接口定义 新增加密算法实现该接口即可
 **/
public interface Crypt {

    /**
     * 加密
     * @param plain 原始明文
     * @return 密文
     */
    String encrypt(String plain);

    /**
     * 解密
     * @param cipher 密文
     * @return 原始明文
     */
    String decrypt(String cipher);

}

③将加密方式添加到加密实现类加载器中。

/**
 * 加密实现类加载器(当前已有AES BASE64两种方式)
 * 后续如果有新增 需要同步添加
 **/
@Component
public class CryptLoader {

    /**
     * 加载所有加密方式实现类
     */
    public CryptLoader() {
        CryptContext.setCrypt(EncryptTypeEnum.AES, new AESCryptImpl());
        CryptContext.setCrypt(EncryptTypeEnum.BASE64, new Base64CryptImpl());
     	CryptContext.setCrypt(EncryptTypeEnum.BASE64, new XXXXCryptImpl());
    }
}

4. 注意事项

​ 由于在数据库内存储的数据为加密后的数据,如需对被加密字段进行匹配检索时,有如下注意事项:

  1. 不支持模糊查询,仅支持精确查询,

  2. 不支持Mybatis自带的QueryWrapper方法,仅支持自定义mapper及xml,

  3. 必须使用已添加CryptEntity和CryptField注解的实体类或自定义类作为参数,

  4. 在mapper中必须使用@Param注解将参数名称映射为"crypt",如下:

    DataMasking selectById(@Param("crypt")DataMasking dataMasking);
    

空文件

简介

基于mybatis拦截器实现数据入库加密/出库解密操作 展开 收起
取消

发行版

暂无发行版

贡献者

全部

语言

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Java
1
https://gitee.com/Wananme/mybatis-interceptor-demo.git
git@gitee.com:Wananme/mybatis-interceptor-demo.git
Wananme
mybatis-interceptor-demo
mybatis-interceptor-demo
master

搜索帮助