網(wǎng)站首頁(yè) 編程語(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)有了
相關(guān)推薦
- 2022-06-09 ASP.NET?Core基于現(xiàn)有數(shù)據(jù)庫(kù)創(chuàng)建EF模型_實(shí)用技巧
- 2022-06-06 MybatisPlus二級(jí)緩存體系探究分析_相關(guān)技巧
- 2022-05-25 utf8_unicode_ci和utf8_general_ci區(qū)別
- 2022-07-18 async+await:發(fā)送Ajax請(qǐng)求
- 2022-10-24 Numpy?數(shù)據(jù)處理?ndarray使用詳解_python
- 2022-07-21 Linux上源碼包安裝nginx及yum 安裝nginx
- 2022-03-14 【golang/方法記錄】有序列表的簡(jiǎn)易實(shí)現(xiàn)
- 2022-05-20 C++實(shí)現(xiàn)公司人事管理系統(tǒng)_C 語(yǔ)言
- 欄目分類(lèi)
-
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支