當前位置:
首頁 > 知識 > 使用AOP實現許可權攔截校驗

使用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的攔截方案,想要修改方法,即攔截目標,就必須修改源碼,所以也就沒有必要做成高度可自定義化的許可權方案。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 千鋒JAVA開發學院 的精彩文章:

MariaDB10.3 系統版本表 有效防止數據丟失
面試官:「談談Spring中都用到了那些設計模式?」

TAG:千鋒JAVA開發學院 |