淺談基於SpringBoot實現一個簡單的權限控制註解
註解是 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讀入 @Documented public @interface Permission { String value() default ""; }
User 類
一個簡單的User類,包含 permissions 用於保存用戶的權限。
import lombok.Data; @Data public class User { private String id; private String name; private Set<String> permissions; }
UserService 類
簡單的 Service 類,用於判斷權限。
@Service public class UserService { public boolean checkCreatePermission(@Permission("創建用戶") User user) { return true; } public boolean checkDeletePermission(@Permission("刪除用戶") User user) { return true; } }
PermissionAspect 類
利用 SpringBoot 簡單地設置切面,獲取註解並使用。這裡直接
@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強轉為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 類
簡單的測試類,用於測試代碼。這裡簡單的配置一個用戶隻有創建用戶的權限
@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("創建用戶"); user.setPermissions(permissions); System.out.println("checkCreatePermission " + userService.checkCreatePermission(user)); System.out.println("checkDeletePermission " + userService.checkDeletePermission(user)); } }
輸出如下日志,證明權限設置起作用瞭。
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): 小明 無權限: 刪除用戶
checkDeletePermission false
到此這篇關於淺談基於SpringBoot實現一個簡單的權限控制註解的文章就介紹到這瞭,更多相關SpringBoot 權限控制註解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Spring Security權限想要細化到按鈕實現示例
- Android權限詢問的實例詳解
- spring-shiro權限控制realm實戰教程
- 詳細瞭解MVC+proxy
- springboot 啟動項目打印接口列表的實現