淺談基于SpringBoot實現(xiàn)一個簡單的權(quán)限控制注解
注解是 JDK 5.0 引入的一種注釋機制。注解可以作用在類型(類、接口、枚舉等)、屬性、方法、參數(shù)等不同位置,具體的 JDK 版本所支持的注解位置可參考 java.lang.annotation.ElementType 。此外還有注解的策略,也就是 RetentionPolicy ,這里不加贅述。
注解可以實現(xiàn)很多功能,其中最主要的就是進行代碼標(biāo)注,所以有時候注解也叫做標(biāo)注。使用起來也基本顧名思義,就是對代碼進行標(biāo)注,簡化部分代碼的邏輯。
下面我們就著手實現(xiàn)一個簡單的權(quán)限控制注解,來對注解有一個基本的了解。
準(zhǔn)備
@Permission 注解
注解本身的代碼很簡單。下面實現(xiàn)的是一個 @Permission 注解,為了方便使用,這里只提供一個屬性value,因為如果一個注解中有一個名稱為value的屬性,且你只想設(shè)置value屬性(即其他屬性都采用默認值或者你只有一個value屬性),那么可以省略掉“value=”部分。
import java.lang.annotation.*;
@Target({ElementType.PARAMETER}) // 注解可用于參數(shù)
@Retention(RetentionPolicy.RUNTIME) // 注解在運行時可由JVM讀入
@Documented
public @interface Permission {
String value() default "";
}
User 類
一個簡單的User類,包含 permissions 用于保存用戶的權(quán)限。
import lombok.Data;
@Data
public class User {
private String id;
private String name;
private Set<String> permissions;
}
UserService 類
簡單的 Service 類,用于判斷權(quán)限。
@Service
public class UserService {
public boolean checkCreatePermission(@Permission("創(chuàng)建用戶") User user) {
return true;
}
public boolean checkDeletePermission(@Permission("刪除用戶") User user) {
return true;
}
}
PermissionAspect 類
利用 SpringBoot 簡單地設(shè)置切面,獲取注解并使用。這里直接
@Aspect
@Component
public class PermissionAspect {
// 需要修改為實際的 Service 所在的 Package
@Pointcut("execution(public * tk.yubarimelon.MongoDemo.service.*.*(..))")
public void permissionCheck() {
}
@Around("permissionCheck()")
public Object before(ProceedingJoinPoint joinPoint) throws Throwable {
Object[] params = joinPoint.getArgs();
// 獲取方法,此處可將signature強轉(zhuǎn)為MethodSignature
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// 獲取參數(shù)注解,1維是參數(shù),2維是注解
Annotation[][] parameterAnnotations = method.getParameterAnnotations();
for (int i = 0; i < parameterAnnotations.length; i++) {
Object param = params[i];
Annotation[] annotations = parameterAnnotations[i];
if (!(param instanceof User) || annotations.length == 0) {
continue;
}
for (Annotation annotation : annotations) {
if (annotation.annotationType().equals(Permission.class)) {
Permission permission = (Permission) annotation;
User user = (User) param;
if (CollectionUtils.isEmpty(user.getPermissions())) {
log.error(user.getName() + " 無任何權(quán)限!");
return false;
}
if (!StringUtils.hasLength(permission.value())) {
log.error(joinPoint.getSignature().toString() + "權(quán)限設(shè)置異常");
return false;
}
if (!user.getPermissions().contains(permission.value())) {
log.error(joinPoint.getSignature().toString() +": "+user.getName() + " 無權(quán)限: " + permission.value());
return false;
}
return joinPoint.proceed();
}
}
}
return joinPoint.proceed();
}
}
ApplicationTests 類
簡單的測試類,用于測試代碼。這里簡單的配置一個用戶只有創(chuàng)建用戶的權(quán)限
@SpringBootTest
class ApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
}
@Test
void checkUser() {
User user = new User();
user.setName("小明");
Set<String> permissions = new HashSet<>();
permissions.add("創(chuàng)建用戶");
user.setPermissions(permissions);
System.out.println("checkCreatePermission " + userService.checkCreatePermission(user));
System.out.println("checkDeletePermission " + userService.checkDeletePermission(user));
}
}
輸出如下日志,證明權(quán)限設(shè)置起作用了。
checkCreatePermission true
2021-01-31 11:44:45.895 ERROR 12388 --- [ main] t.y.MongoDemo.aop.PermissionAspect : boolean tk.yubarimelon.MongoDemo.service.UserService.checkDeletePermission(User): 小明 無權(quán)限: 刪除用戶
checkDeletePermission false
到此這篇關(guān)于淺談基于SpringBoot實現(xiàn)一個簡單的權(quán)限控制注解的文章就介紹到這了,更多相關(guān)SpringBoot 權(quán)限控制注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+Spring Security+JWT實現(xiàn)RESTful Api權(quán)限控制的方法
- Springboot+Shiro+Jwt實現(xiàn)權(quán)限控制的項目實踐
- SpringBoot如何整合Springsecurity實現(xiàn)數(shù)據(jù)庫登錄及權(quán)限控制
- Springboot+Spring Security實現(xiàn)前后端分離登錄認證及權(quán)限控制的示例代碼
- Java SpringBoot 使用攔截器作為權(quán)限控制的實現(xiàn)方法
- Springboot和bootstrap實現(xiàn)shiro權(quán)限控制配置過程
- Springboot+Vue+shiro實現(xiàn)前后端分離、權(quán)限控制的示例代碼
- SpringBoot整合Shiro實現(xiàn)權(quán)限控制的代碼實現(xiàn)
- SpringBoot詳解shiro過濾器與權(quán)限控制
- SpringBoot集成Swagger使用SpringSecurity控制訪問權(quán)限問題
- SpringSecurity實現(xiàn)RBAC權(quán)限管理
相關(guān)文章
SpringBoot整合SpringSession實現(xiàn)分布式登錄詳情
這篇文章主要介紹了SpringBoot整合SpringSession實現(xiàn)分布式登錄詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-08-08
IDEA連接MySQL后管理數(shù)據(jù)庫的操作指南
本節(jié)就來教大家如何在IDEA連接MySQL后管理數(shù)據(jù)庫(創(chuàng)建/修改/刪除數(shù)據(jù)庫、創(chuàng)建/修改/刪除表、插入/更新/刪除/查詢表記錄),文中通過圖文結(jié)合的方式給大家講解的非常詳細,需要的朋友可以參考下2024-05-05
Java如何將ResultSet結(jié)果集遍歷到List中
這篇文章主要介紹了Java如何將ResultSet結(jié)果集遍歷到List中問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-02-02
基于Nacos實現(xiàn)動態(tài)線程池的設(shè)計與實踐分享
在分布式系統(tǒng)架構(gòu)中,線程池是資源調(diào)度的重要工具,傳統(tǒng)固定參數(shù)的線程池在流量平穩(wěn)的場景下表現(xiàn)良好,但面對現(xiàn)代互聯(lián)網(wǎng)業(yè)務(wù)的潮汐流量特征時,往往會出現(xiàn)資源浪費或處理能力不足的問題,所以本文將介紹基于Nacos實現(xiàn)動態(tài)線程池的設(shè)計與實踐,需要的朋友可以參考下2025-05-05
SpringBoot項目執(zhí)行腳本 自動拉取最新代碼并重啟的實例內(nèi)容
在本篇文章里小編給大家整理的是一篇關(guān)于SpringBoot項目執(zhí)行腳本 自動拉取最新代碼并重啟的實例內(nèi)容,有需要的朋友們參考下。2019-12-12
SpringBoot3中數(shù)據(jù)庫集成實踐詳解
項目工程中,集成數(shù)據(jù)庫實現(xiàn)對數(shù)據(jù)的增曬改查管理,是最基礎(chǔ)的能力,所以下面小編就來和大家講講SpringBoot3如何實現(xiàn)數(shù)據(jù)庫集成,需要的可以參考下2023-08-08
java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決
這篇文章主要介紹了java反編譯工具jd-gui-osx?for?mac?M1芯片無法使用的問題及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

