mybatis-data-security提供了一种基于注解实现数据库数据加解密的功能支持。
编写mybatis interceptor实现,对业务代码无侵入,在入库前加密,出库前解密。
目前而言,加密后的密文/解密后的明文都会回写给原来的对象;但是有的时候,我们不希望加解密直接操作原来的对象,而是希望加解密时操作原对象的clone对象时,就可以通过实现com.ideaaedi.mybatis.data.security.support.PojoCloneable
接口来达到这个目的。
注:PojoCloneable的实现类最好不要重写equals与hashcode方法, 否则,可能导致某些场景(如:两个对象的id为null,其余所有的字段值都一样时,同时批量新增这两个对象时)下,部分自增id回填失败,详见源码说明com.ideaaedi.mybatis.data.security.support.PojoCloneable#handleNullPropertyByClonePojo
一般的,在下述场景下比较需要这种能力:
引入相关依赖
mybatis项目
<dependency>
<groupId>com.idea-aedi</groupId>
<artifactId>mybatis-data-security</artifactId>
<version>1.4.3</version>
</dependency>
mybatis-plus项目
<dependency>
<groupId>com.idea-aedi</groupId>
<artifactId>mybatis-data-security</artifactId>
<version>1.4.3-mp3.5.1</version>
</dependency>
注:适配时,是基于mybatis-plus3.5.1版本适配的,其它版本的mybatis-plus也可以用
注:适配时,只适配了常用功能的加解密
使用注解com.ideaaedi.mybatis.data.security.annotation.EnableMybatisDataSecurity
,启用mybatis-data-security功能
@SpringBootApplication
@EnableMybatisDataSecurity
public class YourApplication {
// ...
}
实现com.ideaaedi.mybatis.data.security.support.EncryptExecutor
,定制加解密逻辑
import com.ideaaedi.mybatis.data.security.annotation.Encrypt;
import com.ideaaedi.mybatis.data.security.support.EncryptExecutor;
import com.ideaaedi.mybatis.data.security.util.AesUtil;
import org.springframework.stereotype.Component;
/**
* 实现自己的加解密器 - 示例
*
* @author JustryDeng
* @since 2021/2/11 19:08:05
*/
@Component
public class MyEncryptExecutor implements EncryptExecutor {
@Override
public String encryptParameter(String paramName, String paramValue, Encrypt annotation) {
return AesUtil.encrypt(paramValue);
}
@Override
public String encryptField(String fieldName, String fieldValue, Encrypt annotation, Object pojo) {
return AesUtil.encrypt(fieldValue);
}
@Override
public String decryptField(String fieldName, String fieldValue, Encrypt annotation, Object pojo) {
return AesUtil.decrypt(fieldValue);
}
}
使用注解com.ideaaedi.mybatis.data.security.annotation.Encrypt
控制要加解密的字段
提示:
请着重观察下述示例中的入参出参。
@Insert("INSERT INTO employee (`id`,`name`) VALUES(#{id}, #{name})");
int insertThree(@Param("id")int id, @Param("name") @Encrypt String name);
@MapKey("id")
@Select("SELECT `id`,`name`,`age`,`gender`,`motto`,`birthday`,`hobby` FROM `employee` WHERE name = #{name}");
Map<Integer, Employee> selectMapByName(@Encrypt @Param("name") String name);
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
/** 用户id */
private Integer id;
/** 名字 */
@Encrypt
private String name;
/** 年龄 */
private Integer age;
/** 性别 */
private String gender;
/** 座右铭 */
@Encrypt
private String motto;
/** 生日 */
private String birthday;
/** 爱好 */
@Encrypt
private String hobby;
}
@Insert("INSERT INTO employee (`id`,`name`, `age`, `gender`, `motto`, `birthday`, `hobby`) VALUES(#{u.id},#{u.name},#{u.age},#{u.gender},#{u.motto},#{u.birthday},#{u.hobby})")
@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "u.id")
int insertOne(@Param("u") Employee employee);
@Insert("INSERT INTO employee (`id`, `name`, `age`, `gender`, `motto`, `birthday`, `hobby`) VALUES(#{id},#{name},#{age},#{gender},#{motto},#{birthday},#{hobby})")
@Options(useGeneratedKeys = true, keyColumn = "id", keyProperty = "id")
int insertTwo(Employee employee);
@Insert("INSERT INTO employee (`id`, `name`, `age`) VALUES(#{u.id},#{u.name},#{u.age})")
int insertEight(Map<String, Employee> paramsMap);
@Insert("INSERT INTO employee (`id`,`name`, `age`) VALUES(#{p.u.id},#{p.u.name},#{p.u.age})")
int insertNine(@Param("p") Map<String, Employee> paramsMap);
@InsertProvider(type = AbcMapperProvider.class, method = "insertTenProvider")
int insertTen(List<Employee> employeeList);
@InsertProvider(type = AbcMapperProvider.class, method = "insertElevenProvider")
int insertEleven(@Param("list") List<Employee> employeeList);
@InsertProvider(type = AbcMapperProvider.class, method = "insertTwelveProvider")
Integer insertTwelve(@Param("myArray") Employee[] employeeArray);
@Select("SELECT `id`,`name`,`age`,`gender`,`motto`,`birthday`,`hobby` FROM `employee` WHERE id = #{id}")
Employee selectOneById(@Param("id") Integer id);
@Select("SELECT `id`,`name`,`age`,`gender`,`motto`,`birthday`,`hobby` FROM `employee` ")
List<Employee> selectAll();
@Select("SELECT `id`,`name`,`age`,`gender`,`motto`,`birthday`,`hobby` FROM `employee` ")
Employee[] selectAllAsArray();
@Select("SELECT `id`,`name`,`age`,`gender`,`motto`,`birthday`,`hobby` FROM `employee` WHERE name = #{name}")
Map<Integer, Employee> selectMapByName(@Encrypt @Param("name") String name);
// ...
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。