经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Spring Boot » 查看文章
SpringBoot进阶教程(七十五)数据脱敏
来源:cnblogs  作者:请叫我头头哥  时间:2023/4/3 10:02:39  对本文有异议

无论对于什么业务来说,用户数据信息的安全性无疑都是非常重要的。尤其是在数字经济大火背景下,数据的安全性就显得更加重要。数据脱敏可以分为两个部分,一个是DB层面,防止DB数据泄露,暴露用户信息;一个是接口层面,有些UI展示需要数据脱敏,防止用户信息被人刷走了。

v需求背景

DB层面的脱敏今天先不讲,今天先讲讲依赖于注解的接口层面的数据脱敏,接口层面的脱敏可能最原始和简单的方法就是在每个controller输出数据时,硬性处理。但是这么做的方案,如果后续脱敏规则改了,那需要改的地方就太多了,而且很容易有遗漏的地方,造成全站脱敏规则不统一的情况。所以我们建议的是用注解的方式,可插拔性更好,随时可以更改规则,更加的灵活。

我们今天接到的需求是这样的:

页面或者接口层面的脱敏,大多也是围绕用户手机号啊、真实姓名或者地址等等展开的。

v架构设计

2.1 脱敏字段枚举:SensitivityEnum

这里定义一个敏感字段的枚举,并设定各个字段的脱敏策略。

  1. /**
  2. * @Author tou tou
  3. * @Date 2023/1/15
  4. * @Des 脱敏类型及策略,不同的字段类型适配不同的策略
  5. */
  6. public enum SensitivityEnum {
  7. /**
  8. * 用户名
  9. */
  10. USERNAME(s -> s.replaceAll("\\S*(\\S)", "***$1")),
  11. /**
  12. * 身份证
  13. */
  14. ID_CARD(s -> s.replaceAll("(\\d{4})\\d{10}(\\w{4})", "$1****$2")),
  15. /**
  16. * 手机号
  17. */
  18. PHONE(s -> s.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2")),
  19. /**
  20. * 地址
  21. */
  22. ADDRESS(s -> s.replaceAll("(\\S{3})\\S{2}(\\S*)\\S{2}", "$1****$2****"));
  23. private final Function<String, String> desensitizer;
  24. SensitivityEnum(Function<String, String> desensitizer) {
  25. this.desensitizer = desensitizer;
  26. }
  27. public Function<String, String> desensitizer() {
  28. return desensitizer;
  29. }
  30. }
2.2 创建自定义隐私注解:Sensitivity

都说了,我们使用的是注解的方式脱敏,所以是需要声明一个脱敏注解的,需要用到的地方,按需声明注解即可。非常方便。

  1. /**
  2. * @Author tou tou
  3. * @Date 2023/1/15
  4. * @Des
  5. */
  6. @Retention(RetentionPolicy.RUNTIME)
  7. @Target(ElementType.FIELD)
  8. @JacksonAnnotationsInside
  9. @JsonSerialize(using = SensitivitySerializer.class)
  10. public @interface Sensitivity {
  11. SensitivityEnum strategy();
  12. }
2.3 创建序列化类:SensitivitySerializer
  1. /**
  2. * @Author tou tou
  3. * @Date 2023/1/15
  4. * @Des
  5. */
  6. public class SensitivitySerializer extends JsonSerializer<String> implements ContextualSerializer {
  7. private SensitivityEnum sensitivityEnum;
  8. @Override
  9. public void serialize(String value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
  10. gen.writeString(sensitivityEnum.desensitizer().apply(value));
  11. }
  12. @Override
  13. public JsonSerializer<?> createContextual(SerializerProvider prov, BeanProperty property) throws JsonMappingException {
  14. Sensitivity annotation = property.getAnnotation(Sensitivity.class);
  15. if (Objects.nonNull(annotation)&&Objects.equals(String.class, property.getType().getRawClass())) {
  16. this.sensitivityEnum = annotation.strategy();
  17. return this;
  18. }
  19. return prov.findValueSerializer(property.getType(), property);
  20. }
  21. }
2.4 使用了@Sensitivity注解的实体类
  1. public class UserAccountVO {
  2. private Integer id;
  3. @Sensitivity(strategy = SensitivityEnum.USERNAME)
  4. private String username;
  5. private Integer age;
  6. @Sensitivity(strategy = SensitivityEnum.PHONE)
  7. private String tel;
  8. private String email;
  9. private String account;
  10. }
2.5 插入mysql测试数据
  1. create table useraccount
  2. (
  3. id INT(11),
  4. username NVARCHAR(25),
  5. age INT(11),
  6. phone bigint,
  7. email VARCHAR(80),
  8. account VARCHAR(20),
  9. pwd VARCHAR(20)
  10. );
  11. select * from useraccount;
  12. insert into useraccount values(1,'张老三', 22, 13555551111,'13555551111@126.com','z13555551111', '13555551111');
2.6 测试接口
  1. /**
  2. * @author toutou
  3. * @date by 2019/07
  4. */
  5. @RestController
  6. public class UserController {
  7. @Autowired
  8. UserAccountService userAccountService;
  9. @GetMapping("/user/getuser")
  10. public Result getUserAccountById(@RequestParam("uid") int id){
  11. UserAccountVO user = userAccountService.getUserAccountById(id);
  12. if(user != null){
  13. return Result.setSuccessResult(user);
  14. }else{
  15. return Result.setErrorResult(404, "用户不存在");
  16. }
  17. }
  18. }

v运行效果

SpringBoot进阶教程(七十五)数据脱敏

v源码地址

https://github.com/toutouge/javademosecond/tree/master/hellolearn


作  者:请叫我头头哥
出  处:http://www.cnblogs.com/toutou/
关于作者:专注于基础平台的项目开发。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是作者坚持原创和持续写作的最大动力!

原文链接:https://www.cnblogs.com/toutou/p/17063030.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号