赞
踩
SpringBoot实现返回数据脱敏 对controller返回前端的对象序列化时进行修改。
导出等不在前端展示的不满足,需要用aop的方式
有时,敏感数据返回时,需要进行隐藏处理,但是如果一个字段一个字段的进行硬编码处理的话,不仅增加了工作量,而且后期需求变动的时候,更加是地狱般的工作量变更。
下面,通过身份证,姓名,密码,手机号等等示例去演示脱敏的流程,当然你也可以在此基础上添加自己的实现方式
自定义注解类
1 2 3 4 5 6 7 | @Target(ElementType.FIELD) //作用于字段上 @Retention(RetentionPolicy.RUNTIME) @JacksonAnnotationsInside // 表示自定义自己的注解Sensitive @JsonSerialize(using = SensitiveInfoSerialize.class) // 该注解使用序列化的方式 public @interface Sensitive { SensitizedType value(); } |
复制
创建脱敏字段类型枚举
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
|
复制
脱敏工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 |
|
复制
上述枚举类和脱敏工具类,我使用了hutool中的代码,如果hutool满足你的需求,可以直接把上述自定义注解类和自定义序列化类使用到的SensitizedType类直接替换为hutool中的cn.hutool.core.util.DesensitizedUtil.DesensitizedType的枚举类,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | @NoArgsConstructor @AllArgsConstructor @Getter public class SensitiveInfoSerialize extends JsonSerializer<String> implements ContextualSerializer { private SensitizedType sensitizedType; /** * 步骤一 * 方法来源于ContextualSerializer,获取属性上的注解属性,同时返回一个合适的序列化器 */ @Override public JsonSerializer<?> createContextual(SerializerProvider serializerProvider, BeanProperty beanProperty) throws JsonMappingException, JsonMappingException { // 获取自定义注解 Sensitive annotation = beanProperty.getAnnotation(Sensitive.class); // 注解不为空,且标注的字段为String if(Objects.nonNull(annotation) && Objects.equals(String.class, beanProperty.getType().getRawClass())){ this.sensitizedType = annotation.value(); //自定义情况,返回本序列化器,将顺利进入到该类中的serialize方法中 return this; } // 注解为空,字段不为String,寻找合适的序列化器进行处理 return serializerProvider.findValueSerializer(beanProperty.getType(), beanProperty); } /** * 步骤二 * 方法来源于JsonSerializer<String>:指定返回类型为String类型,serialize()将修改后的数据返回 */ @Override public void serialize(String str, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, IOException { if(Objects.isNull(sensitizedType)){ // 定义策略为空,返回原字符串 jsonGenerator.writeString(str); }else { // 定义策略不为空,返回策略处理过的字符串 jsonGenerator.writeString(SensitizedUtil.desensitized(str,sensitizedType)); } } } |
复制
在需要的脱敏的实体类字段上加上相应的注解
1 2 3 4 5 6 7 8 |
|
复制
1 2 3 4 5 6 7 8 9 |
|
复制
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。