除了在SpringBoot中使用注解和拦截器实现权限控制的经典做法外,也可以通过反射和动态绑定机制来手搓权限控制。
场景模拟:在管理系统中,登录账号后用cookie/session/token记录登录人员的身份(避免不安全的情况尽量不记录private信息)。在执行一个共有的方法时,用identity字段记录该人员的身份,使用反射获取到实例,接下来执行该方法即可。
模拟实现:
//员工类
package com.wyz.test;
public class Employee {
private String name;
private int age;
private double salary;
private void look(){};
}
//经理类
package com.wyz.test;
public class manager extends Employee{
private String name;
private int age;
private double salary;
private void look(){
System.out.println("我可以查看的字段有:(String)name (int)age (double)salary");
};
}
//普通员工类
package com.wyz.test;
public class staff {
private String name;
private int age;
private double salary;
private void look(){
System.out.println("我可以查看的字段有:(String)name (int)age");
};
}
//实习员工类
package com.wyz.test;
public class trainee {
private String name;
private int age;
private double salary;
private void look(){
System.out.println("我不可以查看任何属性");
};
}
//主方法所在类
package com.wyz.test;
import java.lang.reflect.Method;
public class test {
public static void main(String[] args) throws Exception {
String identity = "manager";
Class clazz = Class.forName("com.wyz.test." + identity);
Object o = clazz.newInstance(); //编译类型为Object,运行类型为indentity代表的类,这里是manager
Method m = clazz.getDeclaredMethod("look");
m.setAccessible(true);
m.invoke(o);
}
}
执行结果如下:
将identity改为trainee后执行结果如下: