【轉】一個關於用AOP實現許可權控制的問題,不知道大家怎麼想?
遇到一個許可權驗證的問題。就是說,對於任何一個操作,需要判斷這個人對於這份資源是否有權進行這項操作。這是一個典型的AOP場景,但是試圖橫切的時候遇到了困難。
“許可權驗證”這個aspect需要三項資訊:操作者(userId)、被操作物件(departmentId、resourceFamilyId……)、操作(元件名+方法名)。“操作”的資訊是可以在aspect中直接獲得的;“操作者”的資訊無法直接獲得,但也可以在web層先用filter做一次攔截,將 userId放進ThreadLocal,然後在aspect中取出。最麻煩的就是“被操作物件”的資訊。譬如“刪除部門”操作,被操作物件就是部門的 ID;“修改portlet”操作,被操作物件就是portlet的註冊ID。對於各種各樣不同的service方法,如何在aspect中攔截出被操作物件的資訊?
一種辦法是約定將被操作物件ID放在引數列表的特定位置,譬如每個service方法的第一個引數就是被操作物件的ID,然後aspect始終到這個位置去拿到這個ID,判斷是否有許可權進行此操作。但這就等於給service方法加上了另一層約束,而且這種約束還無法在型別系統中體現出來,一則容易犯錯(譬如忘了這個約定,把ID放到第二個引數了),二則多個aspect的約定還有可能衝突或者混淆。
有沒有辦法清晰地描述這種“aspect對元件的約束”?或者還有沒有更好的辦法?要不然,還真是不太敢多用AOP。
“許可權驗證”這個aspect需要三項資訊:操作者(userId)、被操作物件(departmentId、resourceFamilyId……)、操作(元件名+方法名)。“操作”的資訊是可以在aspect中直接獲得的;“操作者”的資訊無法直接獲得,但也可以在web層先用filter做一次攔截,將 userId放進ThreadLocal,然後在aspect中取出。最麻煩的就是“被操作物件”的資訊。譬如“刪除部門”操作,被操作物件就是部門的 ID;“修改portlet”操作,被操作物件就是portlet的註冊ID。對於各種各樣不同的service方法,如何在aspect中攔截出被操作物件的資訊?
一種辦法是約定將被操作物件ID放在引數列表的特定位置,譬如每個service方法的第一個引數就是被操作物件的ID,然後aspect始終到這個位置去拿到這個ID,判斷是否有許可權進行此操作。但這就等於給service方法加上了另一層約束,而且這種約束還無法在型別系統中體現出來,一則容易犯錯(譬如忘了這個約定,把ID放到第二個引數了),二則多個aspect的約定還有可能衝突或者混淆。
有沒有辦法清晰地描述這種“aspect對元件的約束”?或者還有沒有更好的辦法?要不然,還真是不太敢多用AOP。
相關文章
- 什麼是AOP系列之二:AOP與許可權控制實現(轉)
- SpringBoot(一) 如何實現AOP的許可權控制Spring Boot
- spring aop實現許可權控制,路徑控制Spring
- spring aop實現簡單的許可權控制功能Spring
- 兩個關於許可權設定的問題思考
- 提問:使用spring aop實現許可權管理Spring
- 關於公司程式碼許可權的問題
- 關於oracle檔案許可權的問題Oracle
- 許可權控制及AOP日誌
- spring aop實現許可權管理Spring
- 請教:一個關於行級資料許可權模型的問題模型
- Laravel實現許可權控制Laravel
- 【轉】關於MySQL許可權MySql
- 關於許可權管理的實用指令碼指令碼
- 關於jdon裡許可權系統的問題
- Vue 前端應用實現RBAC許可權控制的一種方式Vue前端
- Spring+Struts 2 實現細粒度許可權控制問題Spring
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- win10老跳出訪問許可權怎麼辦_win10訪問許可權怎麼關閉Win10訪問許可權
- 怎麼控制報表的資料許可權
- 分享!! 如何自定義許可權校驗的註解並用AOP攔截實現許可權校驗
- 關於許可權設定的一個小把戲
- 需要一個前臺許可權管理,或問如何實現
- public_html的許可權問題(轉)HTML
- 一個用 Laravel5.5 自己實現的許可權後臺Laravel
- vue要做許可權管理該怎麼做?如果控制到按鈕級別的許可權怎麼做?Vue
- 基於Spring框架應用的許可權控制系統的研究和實現Spring框架
- 前端許可權控制系統的實現思路前端
- 關於一個CMP關係的問題,很可能被忽略,不知道大家知道嘛
- Spring Security實現基於RBAC的許可權表示式動態訪問控制Spring
- 無程式碼實現CRM角色許可權問題
- React基於RBAC的許可權控制React
- casbin基於golang的許可權控制Golang
- Swift 中 Selector 方法的訪問許可權控制問題Swift訪問許可權
- Quarkus中基於角色的許可權訪問控制教程
- linux怎麼給一個普通使用者reboot許可權?(轉)Linuxboot
- 基於RBAC實現許可權管理
- 關於介面實現的一個小問題