一般含敏感信息的数据会在后面处理好再返还给前端,因为数据脱敏如果交给前端去做,很可能会被工具截取造成信息泄露。
以之前的分页查询用户数据为例,对用户手机号等信息进行脱敏处理。在实现类定义一个脱敏的方法。以手机号码脱敏为例,截取手机号码前4位和后4位,中间以****拼接。
/*
* 用户数据脱敏
*
*/
public static void maskSensitiveInfo(List<User> userList) {
for (User user : userList) {
String phone = user.getPhone();
if (phone != null && phone.length() >= 7) {
String prefix = phone.substring(0, 4);
String suffix = phone.substring(phone.length() - 4);
String maskStr = "****";
String result = prefix + maskStr + suffix;
user.setPhone(result);
}
user.setPassword(null);
String openId = user.getOpenId();
if (openId != null && openId.length() > 8) {
String prefix = openId.substring(0, 4);
String suffix = openId.substring(openId.length() - 4);
String maskStr = "****";
String result = prefix + maskStr + suffix;
user.setOpenId(result);
}
}
}
调用方法对数据进行脱敏
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
/**
* 分页查询
*
* @param dto 用户分页查询参数
* @return 分页查询结果
*/
@Override
public Page<User> findUserByPage(UserPageRequestDto dto) {
// 如果有模糊查询条件,则使用模糊查询方法进行分页查询
if (StrUtil.isNotBlank(dto.getFuzzyCondition())) {
UserMapper userMapper = getBaseMapper();
// 查询总数
Integer total = userMapper.fuzzyPagingQueryTotal(dto);
// 创建一个空的分页查询结果对象
Page<User> voPage = new Page<>();
// 如果有数据则进行查询
if (total != 0) {
// 查询当前页数据
List<User> voList = userMapper.fuzzyPagingQuery(dto);
// 对敏感信息进行处理
maskSensitiveInfo(voList);
voPage.setRecords(voList);
}
// 设置查询结果总数
voPage.setTotal(total);
return voPage;
}
// 没有模糊查询条件则使用普通查询方法进行分页查询
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
// 根据用户名查询
if (dto.getUserName() != null) {
queryWrapper.like(User::getUsername, dto.getUserName());
}
// 根据手机号查询
if (dto.getPhone() != null) {
queryWrapper.like(User::getPhone, dto.getPhone());
}
// 根据创建时间范围查询
List<LocalDateTime> dateRange = dto.getDateRange();
if (dateRange != null && dateRange.size() == 2) {
queryWrapper.between(User::getCreateTime, dateRange.get(0), dateRange.get(1));
}
// 根据创建时间倒序排序
queryWrapper.orderByDesc(User::getCreateTime);
// 创建分页查询对象
Page<User> pagin = new Page<>(dto.getPageIndex(), dto.getPageSize());
// 进行分页查询
page(pagin, queryWrapper);
// 获取当前页的数据
List<User> userList = pagin.getRecords();
// 对敏感信息进行处理
maskSensitiveInfo(userList);
return pagin;
}
}