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 加载,包含在类文件中,在运行时可以被获取到

 

 

 

 

 

二:类的动态加载和静态加载

区别:静态加载的类的源程序在编译时期加载(必须存在),而动态加载的类在编译时期可以缺席(源程序可以不存在)。

相关