首页 > 编程语言 >JAVA实现数据脱敏(结合Spring)

JAVA实现数据脱敏(结合Spring)

时间:2022-12-01 17:33:03浏览次数:48  
标签:body return Spring Object fieldAuthority JAVA 权限 public 脱敏

前言

这个数据脱敏是最近做的一个权限系统的功能,我们这个权限系统包含菜单权限,操作权限,数据权限,字段权限,其中字段权限就是控制字段根据不同的角色隐藏或者显示,这个和数据脱敏也是差不多的,正儿八经的数据脱敏如用户的身份证后几位为**** ,或则如用户电话号码不全部展示,如187 **** 9101,我们做的这种字段权限并不是用****替代,而是这个字段直接不给前端展示!

设计方案

每个接口根据不同的业务模块来控制字段的显示,那么我们可以设计一个注解,这个注解是用来标注当前接口使用哪个业务模块,然后通过业务模块code得到当前接口需要隐藏的字段。然后做一个controller的后置处理即可。这里只是涉及到字段权限控制,后续完整的权限系统涉及会通过其他文章分享出来!

核心代码

权限注解

/**
 * @description: 权限二期权限鉴定注解
 * @author TAO
 * @date 2021/7/13 3:53 下午
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface PreAuthorize {
    /**
     * 角色(多个用英文逗号隔开)
     * @return
     */
  

    /**
     * 权限
     * 注意:格式:moduleName+"_"+permissionName 例如:项目_查看
     * @return
     */
    


    /**
     * 数据权限模块code设置
     * @return
     */
    String moduleCode() default "";

    /**
     * 忽略平台
     * @return
     */
    



}

这里只提供字段权限相关的

Controller使用

@ApiOperation(value = "根据id获取信息", authorizations = @Authorization(value = "token"))
    @GetMapping("/{id}")
    @PreAuthorize(moduleCode = "project_module")
    public ResponseEntity<Project> info(@PathVariable Long id) {

Controller后置处理


@ControllerAdvice
public class DesensitizeResponseBodyAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        if (body == null) {
            return null;
        }
        //得到需要屏蔽的字段
        Set<String> fieldAuthority =  RequestContext.getCurrentHideFieldS();
        if (CollectionUtils.isEmpty(fieldAuthority)) {
            return body;
        }

        if (body instanceof Page) {
            return pageDesensitize(body,fieldAuthority);
        }else{
            return objectDesensitize(body,fieldAuthority);
        }

    }


    //返回值为Page时,数据字段脱敏处理
    public Object pageDesensitize(Object page,Set<String> fieldAuthority) {
        Page newPage = (Page) page;
        List<?> records = newPage.getRecords();
        if (CollectionUtils.isEmpty(records)){
            return page;
        }

        SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
        fieldAuthority.forEach(field ->{
            filter.getExcludes().add(field);
        });

        Class<?> c = records.get(0).getClass();
        newPage.setRecords(JSONObject.parseArray(JSONObject.toJSONString(records, filter),c));
        return newPage;
    }

    //返回值普通对象,数据字段脱敏处理
    public Object objectDesensitize(Object object,Set<String> fieldAuthority) {
        SimplePropertyPreFilter filter = new SimplePropertyPreFilter();
        fieldAuthority.forEach(field ->{
            filter.getExcludes().add(field);
        });

        return JSONObject.parseObject(JSON.toJSONString(object, filter), object.getClass());
    }

}

RequestContext.getCurrentHideFieldS();这个数据在请求认证的时候获取用户权限信息的时候就统一查出来存储在ThreadLocal中,关于ThreadLocal这里不过多讲,需要了解的可以看看往期文章ThreadLocal-同一个线程共享数据,这里只需要知道通过RequestContext.getCurrentHideFieldS();能得到需要隐藏的字段!

标签:body,return,Spring,Object,fieldAuthority,JAVA,权限,public,脱敏
From: https://blog.51cto.com/u_15899048/5903414

相关文章

  • SpringBoot整合ElasticSearch-SpringData
    前言之前写过一篇SpringBoot整合ElasticSearch是使用的elasticsearch-rest-high-level-client,这篇文章使用Spring-Data来操作ElasticSearch。关于ElasticSearch的搭建我......
  • Java面试题大汇总
    Java面试题及答案(2023版),适用于应届生、用工作经验的程序员,每道都是认真筛选出的高频面试题,助力大家能找到满意的工作!下载链接:全部面试题及答案PDF1:阿里巴巴Java面试题......
  • Java面试题及答案整理3
    Java面试题及答案(2023版),适用于应届生、有工作经验的程序员,每道都是认真筛选出的高频面试题,助力大家能找到满意的工作!Java多线程下载链接:全部面试题及答案PDF其他互联......
  • Java设计模式面试题及答案(2023)
    Java面试题及答案(2023版),每道都是认真筛选出的高频面试题,助力大家能找到满意的工作!Java设计模式面试题及答案下载链接:全部面试题及答案PDF其他互联网大厂面试题1:阿里......
  • Spring Boot中@Import三种使用方式
     转载于:公众号:后端元宇宙需要注意的是:ImportSelector、ImportBeanDefinitionRegistrar这两个接口都必须依赖于@Import一起使用,而@Import可以单独使用。@Import......
  • Java常见面试题及答案整理
    Java常见面试题及答案,每道都是认真筛选出的高频面试题,助力大家能找到满意的工作!下载链接:全部面试题及答案PDF其他互联网大厂面试题1:阿里巴巴Java面试题2:阿里云Java面试......
  • springboot启动报错:Failed to start bean ‘documentationPluginsBootstrapper‘
    今天启动时,突然报了这个错误,网上查了下是springboot版本和swagger版本之间的问题,解决办法如下:原因:这是因为Springfox使用的路径匹配是基于AntPathMatcher的,而SpringBoot......
  • Java面试题及答案整理(2023最新版)
    本文分为十九个模块,分别是:「Java基础、容器、多线程、反射、对象拷贝、JavaWeb、异常、网络、设计模式、Spring/SpringMVC、SpringBoot/SpringCloud、Hibernate、MyB......
  • JavaScript笔记
    1、什么是JavaScriptJavaScript是一门脚本语言。ECMAScript可以理解为JavaScript的一个标准最新版本已经到es6版本但是大部分浏览器只停留在支持es5代码上!开发环境---......
  • 教你用JavaScript实现小日历
    案例介绍欢迎来的我的小院,我是霍大侠,恭喜你今天又要进步一点点了!我们来用JavaScript编程实战案例,做一个小日历。小日历主要展示年份、月份、星期和日期。通过实战我们将......