自定義后端URL訪問權限控制(注解方式)
- 一、背景
- 二、資料庫建表
- 三、后臺代碼實作
- 1. 創建權限控制注解(注解類名自定義)
- 2. 獲取注解
- 3. 請求權限業務處理
- 4. 使用:在需要做權限控制的介面方法或在類上貼上該注解,注解值為權限標識
一、背景
該文章將記錄本人在專案中遇到的一個小問題和解決方案,
專案中使用Spring Security做認證和授權,權限只在前端做了按鈕控制,若沒有權限的用戶直接通過URL也能訪問,該文章主要記錄通過注解方式控制后端URL訪問權限,
二、資料庫建表
權限控制標配的五張表(關聯關系如下圖所示):
用戶表、角色表、選單表、用戶與角色關聯表、角色與選單關聯表

三、后臺代碼實作
1. 創建權限控制注解(注解類名自定義)
@Target({ElementType.TYPE, ElementType.METHOD}) // 注解的引數可以根據自己的需要設定
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestPermissions {
String value() default "";
}
2. 獲取注解
private RequestPermissions getAnnotationLog(JoinPoint joinPoint) {
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
if (null != method) {
// 回傳自定義的注解
return method.getAnnotation(RequestPermissions.class);
}
return null;
}
3. 請求權限業務處理
@Aspect // 標記為一個切面,讓容器讀取
@Component
public class RequestPermissionsAspect {
// @annotation的值為自定義注解類全限定名
@Pointcut("@annotation(com.dome.test.RequestPermissions)")
public void permissionsPointCut() {}
@Before("permissionsPointCut()")
public void doBefore(JoinPoint joinPoint) {
this.handleRequestPermissions(joinPoint);
}
private void handleRequestPermissions(final JoinPoint joinPoint) {
// 獲取注解
RequestPermissions request= this.getAnnotationLog(joinPoint);
// 獲取注解值(權限名)
String value = requestPermissions.value(); // value="home:menu:list"
// 此處可通過Shiro或者Spring Security獲取用戶擁有的權限(權限標識)
List<String> userRoleList = getUserRoleList();
// 權限業務邏輯處理
TODO
// 權限業務邏輯處理,例如:判斷用戶擁有的權限里是否包含注解value權限標識
if(!userRoelList.contains(value)){
throw new AnnotationException("您沒有訪問權限,請聯系管理員添加");
}
}
}
4. 使用:在需要做權限控制的介面方法或在類上貼上該注解,注解值為權限標識
@RequestPermissions("home:menu:list")
@ApiOperation("選單串列")
@GetMapping("/menu/list")
public ResultVO findMenuList(String name) {
return ResultVO.ofSuccess(menuService.findMenuList(name));
}
到這一步后端URL權限控制的代碼就完成了,權限控制有很多種方式,Shiro和Spring Security也有動態權限控制,由于專案迭代,為了不影響專案原有業務,本人采用了靈活注解的方式控制,
最后,第一次分享技術文章的程式媛,文章如有不合之處歡迎指出,與大家共同進步,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/114960.html
標籤:其他
