需求描述:
传统项目中,经常会遇到系统根据用户权限的不同,前台部分数据需要打码或者直接隐藏。而且后台返回的数据也需要模糊处理。
文章目录
一、思路和要求
思路: 后端会经过序列化然后传输到前台,我们需要在序列化的时候针对这些需要打码的字段进行特殊处理。
要求: 实现需要有通用性,且最好能做到所有有权限控制的字段
在序列化时都会经过我们的权限判断进行统一
处理。
二、SpringBoot + Jackson序列化
1. 自定义序列化配置
@Configuration
public class TmallConfiguration {
@Autowired
private MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;
@PostConstruct
public void init() {
ObjectMapper objectMapper = mappingJackson2HttpMessageConverter.getObjectMapper();
objectMapper.setSerializerFactory(objectMapper.getSerializerFactory()
.withSerializerModifier(new TmallBeanSerializeModifier()));
}
}
2. 自定义注解
package net.mshome.twisted.tmall.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.FIELD;
import static java.lang.annotation.ElementType.METHOD;
/**
* 权限控制注解,根据权限给字段打马赛克
*
* @author tangjizhouchn@foxmail.com
* @date 2020/3/2
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({
METHOD, FIELD})
public @interface PermissionControlled {
String NULL = "null";
/**
* 可访问的权限集合
*/
String[] include() default {
};
/**
* 不可访问的权限集合
*/
String[] exclude() default {
};
/**
* 针对大多数字段的默认值,接受一个String类型参数,优先级较{@link #supplier()}低
*/
String defaultValue() default NULL;
/**
* 自定义默认值提供者,优先级较{@link #defaultValue()}高
*/
Class<? extends DefaultValueSupplier> supplier() default NullValueSupplier.class;
}
3. 结合自定义注解修改字段的序列化过程
package net.mshome.twisted.tmall.aop.configuration;
import com.fasterxml.jackson.