当前位置:   article > 正文

springboot字段的权限控制_字段级别权限控制方案 spring

字段级别权限控制方案 spring

有些时候我们不想让一些权限不足的人看到一些敏感字段,因此我们可以使用注解+AOP+反射来实现将返回的对象中的敏感字段设置为null值。

1. 编写一个注解,在属性上使用,用来控制字段的权限

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ShowField {
    String value();
}
  • 1
  • 2
  • 3
  • 4
  • 5

2. 编写一个切面,用来实现具体控制字段的逻辑

  • 下面的代码是将前端传入的字段和返回给前端的字段设置为null
@Aspect
public class FiledAspect {
    @Pointcut("execution(public * com.zkane.controller.*.*(..))")
    public void field() {}

    @Before("field()")
    public void doBefore(JoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        for (Object obj : args) {
            filterField(obj);
        }
    }

    @AfterReturning(returning = "obj", pointcut = "field()")
    public void doAfterReturning(Object obj) throws Throwable {
        filterField(obj);
    }

    private void filterField(Object obj) throws IllegalAccessException {
        Field[] fields = obj.getClass().getDeclaredFields();
        for (Field field: fields) {
            field.setAccessible(true);
            ShowField showField = field.getAnnotation(ShowField.class);
            if (showField != null && showField.value().equals("Admin")) {
                field.set(obj, null);
            }
        }
    }

}
  • 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

3. 在启动类将bean添加到ApplicationContext的容器中

@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

	@Bean
	public FiledAspect filedAspect() {
		return new FiledAspect();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

4. 在需要进行权限控制的字段上添加注解

public class User {

    private String name;
    
    @ShowField("Admin")
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
  • 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/442676
推荐阅读
相关标签
  

闽ICP备14008679号