使用AOP實現許可權攔截校驗
aop的好處就在於它可以只讓你寫一次代碼,然後這些代碼就可以用於容器當中的所有對象,許可權攔截校驗是一個表現形式。
那麼,我們要如何實現這個功能?
首先,定義一個註解:
這裡有一個PermissionEnum枚舉類,當然可以直接使用String 代替,不過不推薦,其源碼如下:
這裡,我們控制的許可權顆粒度是方法,所以必須使用一個標識符來標誌出每個方法,我們只要將Permission註解加到方法之上,就能被切面所攔截,並進行許可權校驗:
上面是一個方法示例:
接下來就是重點了,切入點的編寫:
@Before(pointCut())
public void before(JoinPoint joinPoint){
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
var a = method.getAnnotation(Permission.class);
String msg = null;
if (.equals(a.msg())){
msg = 沒有 a.value().getPermission() 許可權;
}else{
msg = a.msg();
}
var permission = adminPermissionService.getCurrentAdminPermission();
try {
String methodName = a.value().getPermission();
methodName = methodName.substring(0,1).toUpperCase() methodName.substring(1,methodName.length());
Method method1 = permission.getClass().getMethod(get methodName);
Boolean ret = (Boolean) method1.invoke(permission);
if (ret == null){
ErrorUtils.error(msg);
}
if (!ret){
ErrorUtils.error(msg);
}
} catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) {
throw new RuntimeException(e.getMessage());
}
}
代碼雖然有點長,但做的事並不多,無非就是獲取當前登錄管理員的許可權,然後判斷該其切點的許可權要求當前管理是否滿足,滿足就繼續運行,否則拋出一個許可權錯誤的異常。
當然,這個許可權攔截校驗方案是寫死的,也就是說你無法根據實際的情況需要添加或者刪除的相應許可權,因為這是由系統的許可權控制方案所限定的,我們許可權攔截的目標是方法,不像其他諸如URL的攔截方案,想要修改方法,即攔截目標,就必須修改源碼,所以也就沒有必要做成高度可自定義化的許可權方案。
![](https://pic.pimg.tw/zzuyanan/1488615166-1259157397.png)
![](https://pic.pimg.tw/zzuyanan/1482887990-2595557020.jpg)
※MariaDB10.3 系統版本表 有效防止數據丟失
※面試官:「談談Spring中都用到了那些設計模式?」
TAG:千鋒JAVA開發學院 |