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

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Springboot使用注解實(shí)現(xiàn)權(quán)限校驗(yàn)

作者:憤怒的小肥 更新時(shí)間: 2024-07-13 編程語(yǔ)言

Springboot實(shí)現(xiàn)注解判斷權(quán)限

今天記錄一下使用springboot的注解來(lái)給方法加權(quán)限
避免了每個(gè)方法都需要大量的權(quán)限判斷 超級(jí)好用√

目錄

  • Springboot實(shí)現(xiàn)注解判斷權(quán)限
    • 1.創(chuàng)建權(quán)限注解
    • 2.定義一個(gè)權(quán)限的枚舉類(lèi)
    • 3.創(chuàng)建攔截器AOP校驗(yàn)權(quán)限
      • poincut表達(dá)式介紹
    • 4.使用注解

1.創(chuàng)建權(quán)限注解

首先我們先創(chuàng)建一個(gè)注解類(lèi)

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

    /**
     * 測(cè)試注解類(lèi)
     * mustRole : 方法使用需要的權(quán)限
     * @return
     */
    String mustRole() default "";

}

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

2.定義一個(gè)權(quán)限的枚舉類(lèi)

接下來(lái)我們創(chuàng)建一個(gè)角色權(quán)限的枚舉類(lèi)

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

    UserRoleEnum(String text, String value) {
        this.text = text;
        this.value = value;
    }
    /**
     * 根據(jù) 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.創(chuàng)建攔截器AOP校驗(yàn)權(quán)限

定義一個(gè)攔截器

@Aspect
@Component
public class AuthInterceptor {
    @Resource
    private UserService userService;
    /**
     * 執(zhí)行攔截
     *
     * @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();
        // 獲取當(dāng)前用戶的信息
        User loginUser = userService.getLoginUser(request);
        // 必須有該權(quán)限才通過(guò)
        if (StringUtils.isNotBlank(mustRole)) {
            UserRoleEnum mustUserRoleEnum = UserRoleEnum.getEnumByValue(mustRole);
            if (mustUserRoleEnum == null) {
                throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
            }
            String userRole = loginUser.getUserRole();
            // 如果被封號(hào),直接拒絕
            if (UserRoleEnum.BAN.equals(mustUserRoleEnum)) {
                throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
            }
            // 必須有管理員權(quán)限
            if (UserRoleEnum.ADMIN.equals(mustUserRoleEnum)) {
                if (!mustRole.equals(userRole)) {
                    throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
                }
            }
        }
        // 通過(guò)權(quán)限校驗(yàn),放行
        return joinPoint.proceed();
    }
}

其中常見(jiàn)的AOP注解:

  • @Aspect注解是把當(dāng)前類(lèi)標(biāo)識(shí)為一個(gè)切面
  • @Pointcut 植入Advice(通知)的觸發(fā)條件。

poincut表達(dá)式介紹

攔截內(nèi)容輸入規(guī)范(pointcut表達(dá)式)
execute等

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

  • execution(): 表達(dá)式主體
  • 第一個(gè)*號(hào):表示返回類(lèi)型,*號(hào)表示所有的類(lèi)型
  • 包名:表示需要攔截的包名,后面的兩個(gè)句點(diǎn)表示當(dāng)前包和當(dāng)前包的所有子包,com.example.lx包、子孫包
  • 第二個(gè)*號(hào):表示類(lèi)名,*號(hào)表示所有的類(lèi)。
  • (…):第三個(gè)號(hào)表示方法名,*號(hào)表示所有的方法,(…)表示方法參數(shù),兩個(gè)句點(diǎn)表示任何參數(shù)

五種增強(qiáng)注解

  • @Before 前置增強(qiáng),相當(dāng)于BeforeAdvice,目標(biāo)方法執(zhí)行前執(zhí)行
  • @After final增強(qiáng),不管是拋出異常或者正常退出都會(huì)執(zhí)行
  • @AfterReturning 后置增強(qiáng),相當(dāng)于AfterReturningAdvice,方法正常退出時(shí)執(zhí)行
  • @AfterThrowing 異常拋出增強(qiáng),相當(dāng)于ThrowsAdvice,目標(biāo)方法拋出異常后執(zhí)行
  • @Around 環(huán)繞增強(qiáng),相當(dāng)于MethodInterceptor

注意:1、前四種增強(qiáng)修飾的方法可以通過(guò)聲明JoinPoint 類(lèi)型參數(shù)變量獲取目標(biāo)方法的信息(方法名、參數(shù)列表等信息);@Around修飾的方法必須聲明ProceedingJoinPoint類(lèi)型的參數(shù),該變量可以決定是否執(zhí)行目標(biāo)方法,jp.proceed()表示執(zhí)行目標(biāo)方法

2、前四種增強(qiáng)修飾的方法沒(méi)有返回值(即為void);而@Around修飾的方法必須有返回值,返回值為目標(biāo)方法的返回值;

4.使用注解

最后在我們Controller層的方法上使用注解就可以進(jìn)行權(quán)限的校驗(yàn)啦

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

上面就已經(jīng)設(shè)置成只有管理員才能添加用戶了
大功告成√

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

  • 上一篇:沒(méi)有了
  • 下一篇:沒(méi)有了
欄目分類(lèi)
最近更新