日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Springboot使用注解實現權限校驗

作者:憤怒的小肥 更新時間: 2024-07-13 編程語言

Springboot實現注解判斷權限

今天記錄一下使用springboot的注解來給方法加權限
避免了每個方法都需要大量的權限判斷 超級好用√

目錄

  • Springboot實現注解判斷權限
    • 1.創建權限注解
    • 2.定義一個權限的枚舉類
    • 3.創建攔截器AOP校驗權限
      • poincut表達式介紹
    • 4.使用注解

1.創建權限注解

首先我們先創建一個注解類

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthCheck {

    /**
     * 測試注解類
     * mustRole : 方法使用需要的權限
     * @return
     */
    String mustRole() default "";

}

其中@Target(ElementType.METHOD)
注解表示該注解是使用在方法上的
@Retention(RetentionPolicy.RUNTIME)
定義了該注解的生命周期(我也是剛補完這塊知識

2.定義一個權限的枚舉類

接下來我們創建一個角色權限的枚舉類

public enum UserRoleEnum {
    USER("用戶", "user"),
    ADMIN("管理員", "admin"),
    BAN("被封號", "ban");
    private final String text;
    private final String value;

    UserRoleEnum(String text, String value) {
        this.text = text;
        this.value = value;
    }
    /**
     * 根據 value 獲取枚舉
     */
    public static UserRoleEnum getEnumByValue(String value) {
        if (ObjectUtils.isEmpty(value)) {
            return null;
        }
        for (UserRoleEnum anEnum : UserRoleEnum.values()) {
            if (anEnum.value.equals(value)) {
                return anEnum;
            }
        }
        return null;
    }

    public String getValue() {
        return value;
    }

    public String getText() {
        return text;
    }
}

3.創建攔截器AOP校驗權限

定義一個攔截器

@Aspect
@Component
public class AuthInterceptor {
    @Resource
    private UserService userService;
    /**
     * 執行攔截
     *
     * @param joinPoint
     * @param authCheck
     * @return
     */
    @Around("@annotation(authCheck)")
    public Object doInterceptor(ProceedingJoinPoint joinPoint, AuthCheck authCheck) throws Throwable {
        String mustRole = authCheck.mustRole();
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
        HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
        // 獲取當前用戶的信息
        User loginUser = userService.getLoginUser(request);
        // 必須有該權限才通過
        if (StringUtils.isNotBlank(mustRole)) {
            UserRoleEnum mustUserRoleEnum = UserRoleEnum.getEnumByValue(mustRole);
            if (mustUserRoleEnum == null) {
                throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
            }
            String userRole = loginUser.getUserRole();
            // 如果被封號,直接拒絕
            if (UserRoleEnum.BAN.equals(mustUserRoleEnum)) {
                throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
            }
            // 必須有管理員權限
            if (UserRoleEnum.ADMIN.equals(mustUserRoleEnum)) {
                if (!mustRole.equals(userRole)) {
                    throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
                }
            }
        }
        // 通過權限校驗,放行
        return joinPoint.proceed();
    }
}

其中常見的AOP注解:

  • @Aspect注解是把當前類標識為一個切面
  • @Pointcut 植入Advice(通知)的觸發條件。

poincut表達式介紹

攔截內容輸入規范(pointcut表達式)
execute等

示例:@Around(“execution(* com.springboot.controller..(…))”)

  • execution(): 表達式主體
  • 第一個*號:表示返回類型,*號表示所有的類型
  • 包名:表示需要攔截的包名,后面的兩個句點表示當前包和當前包的所有子包,com.example.lx包、子孫包
  • 第二個*號:表示類名,*號表示所有的類。
  • (…):第三個號表示方法名,*號表示所有的方法,(…)表示方法參數,兩個句點表示任何參數

五種增強注解

  • @Before 前置增強,相當于BeforeAdvice,目標方法執行前執行
  • @After final增強,不管是拋出異常或者正常退出都會執行
  • @AfterReturning 后置增強,相當于AfterReturningAdvice,方法正常退出時執行
  • @AfterThrowing 異常拋出增強,相當于ThrowsAdvice,目標方法拋出異常后執行
  • @Around 環繞增強,相當于MethodInterceptor

注意:1、前四種增強修飾的方法可以通過聲明JoinPoint 類型參數變量獲取目標方法的信息(方法名、參數列表等信息);@Around修飾的方法必須聲明ProceedingJoinPoint類型的參數,該變量可以決定是否執行目標方法,jp.proceed()表示執行目標方法

2、前四種增強修飾的方法沒有返回值(即為void);而@Around修飾的方法必須有返回值,返回值為目標方法的返回值;

4.使用注解

最后在我們Controller層的方法上使用注解就可以進行權限的校驗啦

    @PostMapping("/add")
    @AuthCheck(mustRole = UserConstant.ADMIN_ROLE)
    public void addUser() {
		//一大堆邏輯
    }

上面就已經設置成只有管理員才能添加用戶了
大功告成√

原文鏈接:https://blog.csdn.net/qq_59622162/article/details/131701823

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新