【轉】一個關於用AOP實現許可權控制的問題,不知道大家怎麼想?

markyang發表於2005-02-06
遇到一個許可權驗證的問題。就是說,對於任何一個操作,需要判斷這個人對於這份資源是否有權進行這項操作。這是一個典型的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。

相關文章