淺談基于SpringBoot實(shí)現(xiàn)一個(gè)簡單的權(quán)限控制注解
注解是 JDK 5.0 引入的一種注釋機(jī)制。注解可以作用在類型(類、接口、枚舉等)、屬性、方法、參數(shù)等不同位置,具體的 JDK 版本所支持的注解位置可參考 java.lang.annotation.ElementType 。此外還有注解的策略,也就是 RetentionPolicy ,這里不加贅述。
注解可以實(shí)現(xiàn)很多功能,其中最主要的就是進(jìn)行代碼標(biāo)注,所以有時(shí)候注解也叫做標(biāo)注。使用起來也基本顧名思義,就是對代碼進(jìn)行標(biāo)注,簡化部分代碼的邏輯。
下面我們就著手實(shí)現(xiàn)一個(gè)簡單的權(quán)限控制注解,來對注解有一個(gè)基本的了解。
準(zhǔn)備
@Permission 注解
注解本身的代碼很簡單。下面實(shí)現(xiàn)的是一個(gè) @Permission 注解,為了方便使用,這里只提供一個(gè)屬性value,因?yàn)槿绻粋€(gè)注解中有一個(gè)名稱為value的屬性,且你只想設(shè)置value屬性(即其他屬性都采用默認(rèn)值或者你只有一個(gè)value屬性),那么可以省略掉“value=”部分。
import java.lang.annotation.*; @Target({ElementType.PARAMETER}) // 注解可用于參數(shù) @Retention(RetentionPolicy.RUNTIME) // 注解在運(yùn)行時(shí)可由JVM讀入 @Documented public @interface Permission { String value() default ""; }
User 類
一個(gè)簡單的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 { // 需要修改為實(shí)際的 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強(qiáng)轉(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 類
簡單的測試類,用于測試代碼。這里簡單的配置一個(gè)用戶只有創(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實(shí)現(xiàn)一個(gè)簡單的權(quán)限控制注解的文章就介紹到這了,更多相關(guān)SpringBoot 權(quán)限控制注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringMVC + jquery.uploadify實(shí)現(xiàn)上傳文件功能
文件上傳是很多項(xiàng)目都會使用到的功能,SpringMVC當(dāng)然也提供了這個(gè)功能。不過小編不建議在項(xiàng)目中通過form表單來提交文件上傳,這樣做的局限性很大。下面這篇文章主要介紹了利用SpringMVC + jquery.uploadify實(shí)現(xiàn)上傳文件功能的相關(guān)資料,需要的朋友可以參考下。2017-06-06Java實(shí)現(xiàn)注冊登錄與郵箱發(fā)送賬號驗(yàn)證激活功能
這篇文章主要介紹了Java實(shí)現(xiàn)注冊登錄與郵箱發(fā)送賬號驗(yàn)證激活功能,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧2022-12-12SpringBoot項(xiàng)目熱部署的實(shí)現(xiàn)
SpringBoot項(xiàng)目熱部署是一種讓開發(fā)人員在修改代碼后無需重啟應(yīng)用即可看到更改效果的技術(shù),通過使用SpringBoot的DevTools等工具,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09Jmeter跨線程組傳值調(diào)用實(shí)現(xiàn)圖解
這篇文章主要介紹了Jmeter跨線程組傳值調(diào)用實(shí)現(xiàn)圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07Java TCP網(wǎng)絡(luò)通信協(xié)議詳細(xì)講解
TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission?Control?Protocol,它是位于網(wǎng)絡(luò)OSI模型中的第四層2022-09-09