av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術文章
文章詳情頁

淺談基于SpringBoot實現一個簡單的權限控制注解

瀏覽:5日期:2023-03-26 10:11:59

注解是 JDK 5.0 引入的一種注釋機制。注解可以作用在類型(類、接口、枚舉等)、屬性、方法、參數等不同位置,具體的 JDK 版本所支持的注解位置可參考 java.lang.annotation.ElementType 。此外還有注解的策略,也就是 RetentionPolicy ,這里不加贅述。

注解可以實現很多功能,其中最主要的就是進行代碼標注,所以有時候注解也叫做標注。使用起來也基本顧名思義,就是對代碼進行標注,簡化部分代碼的邏輯。

下面我們就著手實現一個簡單的權限控制注解,來對注解有一個基本的了解。

準備@Permission 注解

注解本身的代碼很簡單。下面實現的是一個 @Permission 注解,為了方便使用,這里只提供一個屬性value,因為如果一個注解中有一個名稱為value的屬性,且你只想設置value屬性(即其他屬性都采用默認值或者你只有一個value屬性),那么可以省略掉“value=”部分。

import java.lang.annotation.*;@Target({ElementType.PARAMETER}) // 注解可用于參數@Retention(RetentionPolicy.RUNTIME) // 注解在運行時可由JVM讀入@Documentedpublic @interface Permission { String value() default '';}User 類

一個簡單的User類,包含 permissions 用于保存用戶的權限。

import lombok.Data;@Datapublic class User { private String id; private String name; private Set<String> permissions;}UserService 類

簡單的 Service 類,用于判斷權限。

@Servicepublic class UserService { public boolean checkCreatePermission(@Permission('創建用戶') User user) { return true; } public boolean checkDeletePermission(@Permission('刪除用戶') User user) { return true; }}PermissionAspect 類

利用 SpringBoot 簡單地設置切面,獲取注解并使用。這里直接

@Aspect@Componentpublic 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強轉為MethodSignature MethodSignature signature = (MethodSignature) joinPoint.getSignature(); Method method = signature.getMethod(); // 獲取參數注解,1維是參數,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() + ' 無任何權限!'); return false; } if (!StringUtils.hasLength(permission.value())) { log.error(joinPoint.getSignature().toString() + '權限設置異常'); return false; } if (!user.getPermissions().contains(permission.value())) { log.error(joinPoint.getSignature().toString() +': '+user.getName() + ' 無權限: ' + permission.value()); return false; } return joinPoint.proceed();} } } return joinPoint.proceed(); }}ApplicationTests 類

簡單的測試類,用于測試代碼。這里簡單的配置一個用戶只有創建用戶的權限

@SpringBootTestclass ApplicationTests { @Autowired UserService userService; @Test void contextLoads() { } @Test void checkUser() { User user = new User(); user.setName('小明'); Set<String> permissions = new HashSet<>(); permissions.add('創建用戶'); user.setPermissions(permissions); System.out.println('checkCreatePermission ' + userService.checkCreatePermission(user)); System.out.println('checkDeletePermission ' + userService.checkDeletePermission(user)); }}

輸出如下日志,證明權限設置起作用了。

checkCreatePermission true2021-01-31 11:44:45.895 ERROR 12388 --- [ main] t.y.MongoDemo.aop.PermissionAspect : boolean tk.yubarimelon.MongoDemo.service.UserService.checkDeletePermission(User): 小明 無權限: 刪除用戶checkDeletePermission false

到此這篇關于淺談基于SpringBoot實現一個簡單的權限控制注解的文章就介紹到這了,更多相關SpringBoot 權限控制注解內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
主站蜘蛛池模板: 黄色免费av | 中文字幕成人免费视频 | 精品久久久久久亚洲精品 | 国产精品免费观看 | 国产精品毛片无码 | 中文字幕日韩欧美一区二区三区 | 日韩欧美一区二区三区在线播放 | 中文字幕一区在线观看视频 | 影音先锋欧美资源 | 美女视频h| 亚洲啊v | 国产aⅴ爽av久久久久久久 | 一级黄色短片 | 亚洲日本一区二区 | 久久看精品| 精品一区二区在线观看 | 少妇淫片aaaaa毛片叫床爽 | 国产传媒在线播放 | 999久久久 | 古装人性做爰av网站 | 羞羞视频在线观看 | 一级毛片高清 | 亚洲 精品 综合 精品 自拍 | 欧美精品在线免费观看 | 91日韩在线 | 久久99视频精品 | 天堂久久久久久久 | 欧美亚洲国产一区二区三区 | 国产一区二区在线免费观看 | 天天色综 | 国产精品久久久久久久久久免费看 | 99热在这里只有精品 | av天天看 | 精品一区二区久久久久久久网站 | 国产精品欧美一区二区三区不卡 | 日韩精品在线网站 | www亚洲一区 | 国产精品视频免费播放 | 国产高清自拍视频在线观看 | 亚洲视频一区在线观看 | 精品国产伦一区二区三区观看方式 |