網站首頁 編程語言 正文
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
- 上一篇:沒有了
- 下一篇:沒有了
相關推薦
- 2022-06-02 C語言實現簡單的抽獎系統_C 語言
- 2022-10-01 iOS實現UIButton的拖拽功能_IOS
- 2022-04-25 django數據庫遷移migration實現_python
- 2022-08-14 C++學習之算術運算符使用詳解_C 語言
- 2022-04-25 JQuery實現Table的tr上移下移功能_jquery
- 2022-02-13 使用paddlepaddle進行手寫數字識別
- 2022-07-26 Python程序元素分析和注意事項
- 2022-09-01 React新文檔切記不要濫用effect_React
- 欄目分類
-
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支