利用AOP簡單實在的防止系統垂直越權

還是前幾篇博客中提到過的項目,接盤過來後一直在重構它。重構的過程中,JIRA就給我發了個警告:

天吶真的是會給我找事情,那就趁着這次重構順便解決它吧。

一個成熟的系統權限控制都會用角色去控制用戶權限,比如admin管理員和operate操作員兩個角色,如果系統中某個功能只能管理員使用,但是如果操作員也能使用的話就是垂直越權。

防止垂直越權最簡單,但是沒什麼用的做法就是頁面元素分角色權限展示。就拿這個WPP系統中的一個例子,有一個重建索引功能,如下:

這個功能是隻能admin用戶才能用,最簡單的就是當admin用戶登錄的時候這個按鈕就顯示,否則其他用戶沒有權限就隱藏這個按鈕,這就是頁面元素分角色權限展示,這是防止垂直越權最簡單的方法了。但是不好意思沒什麼用,誰說看不到就操作不了啦?稍微懂一點編程的直接調接口不就炸了。 

這次JIRA發給我的警告就是這種情況,非admin用戶直接調用接口還是可以操作只有admin用戶纔有權限的功能,想了一會,要解決這個問題,權限顆粒度就得做到接口層面了,毋庸置疑用AOP來做最合適。

思路就是自定義一個註解,打在需要控制權限的接口方法上,並且設置這個接口的權限角色。然後寫一個AOP,切點就是打了這個自定義註解的方法,前置通知把方法攔截後,先拿到當前登錄用戶的角色,再拿到自定義註解中該方法的權限角色,根據這些判斷當前登錄用戶有沒有權限調用這個接口。如果有權限請求正常繼續往下走,如果沒有權限直接返回Response,裏面可以寫明沒有權限。思路就是這樣,代碼實現如下:

自定義註解:

 aop的切點:

aop的前置通知:

 使用起來的就是這樣在接口上打上自定義註解,並設置權限:

至於如何在前置通知中拿到當前登錄用戶,每個權限框架都不一樣,這個項目用的是shiro,可以直接使用SecurityUtils去拿,其他權限框架比如Spring Security肯定也有自己的方法,這裏就不多解釋了。

用AOP去實現接口層面的權限管理是最簡單實用的了。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章