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 加載,包含在類文件中,在運行時可以被獲取到

 

 

 

 

 

二:類的動態加載和靜態加載

區別:靜態加載的類的源程序在編譯時期加載(必須存在),而動態加載的類在編譯時期可以缺席(源程序可以不存在)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM