springboot自定义注解类实现登录用户权限判断
需求:每个接口都会去判断当前用户的权限是否能访问。当前用户共有3类角色权限,分别为普通用户(ordinaryUser),贵宾用户(vipUser),超级用户(superUser),优先级依次递增。
分析:可在每个控制器类上加上注解,该注解即代表控制器类中每个接口的被访问权限。若想修改具体接口的权限,可在接口上加上注解。即控制器类中接口的权限优先级 > 控制器类的权限。
实现:
1.定义一个常量类,保存3种不同的角色权限。
/** * 常量类 * * @author xxwu*/ public class ConstantClass{ /** * 普通用户 */ public static final String ORDINARY_USER = "ordinaryUser"; /** * 贵宾用户 */ public static final String VIP_USER = "vipUser"; /** * 超级用户 */ public static final String SUPER_USER= "superUser"; }
2.自定义一个注解类
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) public @interface UserAuthority { /** * 默认权限为普通用户 * * @return */ String[] role() default ConstantClass.ORDINARY_USER;
}
3.在控制器接口类上 或 接口方法上加上注解
@UserAuthority(role = {ConstantClass.ORDINARY_USER,ConstantClass.VIP_USER})
4.获取接口类上或者接口方法上自定义注解权限的值
import org.springframework.web.method.HandlerMethod;
String[] roles = null; //用户权限优先级:方法 > 类,以优先级高为准。 if (object instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) object; UserAuthority userAuthority = handlerMethod.getMethodAnnotation(UserAuthority.class); if (userAuthority != null) { //获取方法注解上的用户权限 roles = userAuthority.role(); } if ((roles == null || roles.length <= 0) && handlerMethod.getMethod().getDeclaringClass() != null) { userAuthority = handlerMethod.getMethod().getDeclaringClass().getAnnotation(UserAuthority.class); if (userAuthority != null) { /获取类注解上的用户权限 roles = userAuthority.role(); } } }
??ヽ(°▽°)ノ?
一:元注解:
1.@Target:表明该注解可以应用到的元素类型
Target类型 | 描述 |
---|---|
Element.TYPE |
应用于类、接口(包括注解类型)、枚举 |
Element.FIELD |
应用于属性(包括枚举中的常量) |
Element.METHOD |
应用于方法 |
Element.PARAMETER |
应用于方法的形参 |
Element.CONSTRUCTOR |
应用于构造函数 |
Element.LOCAL_VARIABLE |
应用于局部变量 |
Element.ANNOTATION_TYPE |
应用于注解类型 |
Element.PACKAGE |
应用于包 |
Element.TYPE_PARAMETER |
应用于类型变量 |
Element.TYPE_USE |
应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型) |
2.@Retention:表明注解的生命周期
生命周期 | 描述 |
RetentionPolicy.SOURCE | 编译时被丢弃,不包含在类文件中 |
RetentionPolicy.CLASS | JVM加载时被丢弃,包含在类文件中,默认值 |
RetentionPolicy.RUNTIME | 由JVM 加载,包含在类文件中,在运行时可以被获取到 |
二:类的动态加载和静态加载
区别:静态加载的类的源程序在编译时期加载(必须存在),而动态加载的类在编译时期可以缺席(源程序可以不存在)。