跳到主要内容

脱敏注解@Sensitive

用途说明:数据脱敏即将一些敏感信息通过加密、格式化等方式处理,展示给用户一个新的或是格式化后的信息,避免了敏感信息的暴露。

一、接口脱敏注解

针对接口数据实现脱敏加密,只加密,一般此方案用于数据加密展示。

1.1 注解介绍

注解作用域描述
@Sensitive实体脱敏加密注解,表示接口返回这个实体的值进行脱敏处理

1.2 示例

只需要给实体加上注解,返回接口字段数据自动加密

1.3 脱敏类型

数据处理规则支持:加密处理、用户名称格式化、身份证号码格式化、邮件电话格式化等

语法:字段注解@Sensitive属性type,默认是encode(加密处理)

敏感类型支持如下:

public enum SensitiveEnum {
/**
* 加密
*/
ENCODE,
/**
* 中文名
*/
CHINESE_NAME,
/**
* 身份证号
*/
ID_CARD,
/**
* 座机号
*/
FIXED_PHONE,
/**
* 手机号
*/
MOBILE_PHONE,
/**
* 地址
*/
ADDRESS,
/**
* 电子邮件
*/
EMAIL,
/**
* 银行卡
*/
BANK_CARD,
/**
* 公司开户银行联号
*/
CNAPS_CODE;
}

二、方法脱敏注解

针对service方法可脱敏加密、可解密。

2.1 注解介绍

注解作用域描述
@SensitiveEncodeservice方法脱敏加密注解,表示该方法的返回值需要脱敏处理
@SensitiveDecodeservice方法脱敏解密注解,表示该方法的返回值需要解密(仅支持对脱敏encode之后的解密)
@SensitiveField实体字段表示该字段需要脱敏处理

重要提醒:数据脱敏是基于AOP实现的,所以不要在同一个类中调用带有上述注解的方法,这样会导致aop失效。

2.2 脱敏注解用法

  1. 给实体字段上添加注解:@SensitiveField;只给需要脱敏的字段加注解,不需要脱敏的字段,不用加注解
public class LoginUser {

/**
* 登录人密码
*/
@SensitiveField
private String password;
  1. service方法上添加注解@SensitiveEncode
@Override
@SensitiveEncode
public LoginUser getEncodeUserInfo(String username){
if(oConvertUtils.isEmpty(username)) {
return null;
}
LoginUser loginUser = new LoginUser();
SysUser sysUser = userMapper.getUserByName(username);
if(sysUser==null) {
return null;
}
BeanUtils.copyProperties(sysUser, loginUser);
return loginUser;
}

注意:在方法上添加注解@SensitiveEncode后表示该方法的返回值会进行脱敏处理。

脱敏逻辑:

  • 拦截器会针对实体LoginUser中的加注解@SensitiveField字段进行脱敏处理。
  • 方法返回值类型支持LoginUser 也支持 List<LoginUser>
  1. 脱敏数据类型
  • 数据处理规则支持:加密处理、用户名称格式化、身份证号码格式化、邮件电话格式化等
  • 语法:字段注解@SensitiveField属性type,默认是encode(加密处理),如:
/**
* 登录人密码
*/
@SensitiveField(type = SensitiveEnum.ENCODE)
private String password;

/**
* 电子邮件
*/
@SensitiveField(type = SensitiveEnum.EMAIL)
private String email;

/**
* 电话
*/
@SensitiveField(type = SensitiveEnum.MOBILE_PHONE)
private String phone;

更多参考枚举类:org.jeecg.common.desensitization.enums.SensitiveEnum

2.3 解密注解用法

说明:针对数据进行脱敏加密后,jeecgboot也提供了解密注解,即还原真实数据。

语法:在方法上添加注解@SensitiveDecode,即表示该方法的返回值会做一次解密处理。


@SensitiveDecode
public LoginUser getUserByName(String username) {
LoginUser user = sysUserService.getEncodeUserInfo(username);
return user;
}