1. 程式人生 > >acegi security實踐教程—資源角色資訊存到放資料庫

acegi security實踐教程—資源角色資訊存到放資料庫

  回顧:

  前幾篇部落格中,我們都是在acegi配置檔案中配置那些web資源需要保護,這次為了更接近企業開發,我們把web資源角色資訊都存放到資料庫中。   那既然自己設計表,那麼就需要自己重新定義 objectDefinitionSource了,那先看看我們原來acegi的配置:      那預設的呼叫PathBasedFilterInvocationDefinitionMap類,      主要的方法如下:
     

  前提說明:

  在最近幾篇部落格中,都有debug步驟,其中debug步驟,是因為除錯中為了看原始碼必經之路,為了更讓同學們瞭解其呼叫步驟,所以才加入debug步驟。在部落格中不可能把所有的原始碼貼出,所以只能截關鍵程式碼。因為有時自定義類,想知道何時何地以及如何調到自己實現類。   有時為了明白框架為何丟擲異常以及為何轉到這種頁面,這個時候都需要一遍遍又一遍遍又又……的debug,哈哈,大家肯定都有這種經歷吧

具體開發步驟:

  開發環境:

  MyEclispe10.7.1+tomcat6.0.37+acegi1.0.5+spring2.0

  專案目錄如下:

  其中readme主要用來記錄本次驗證目的  

講解:

 根據上述預設的PathBasedFilterInvocationDefinitionMap類,我們主要重寫其方法即可,只要把其角色資訊封裝成ConfigAttributeDefinition物件返回即可。
 封裝的類資訊如下:

debug執行:

 當職責連執行到FilterSecurityInterceptor類的doFilter時:

 第一步:進入FilterSecurityInterceptor類的DoFilter方法中


 

 第二步:進入invoke方法


 第三步:進入beforeInvocation方法,此方法主要獲取其web資源對應的角色資訊


 第四步:通過抽象類查詢url對應的角色,然後呼叫自定義類查詢url對應的角色資訊


若訪問的url有相應的許可權,則返回其角色;否則則返回null。若返回後,我們看看後面是如何繼續執行的?
  若資料庫中沒有其url對應的角色資訊,則程式職責連繼續執行,因為FilterSecurityInterceptor是最後一個Filter,因為執行完後,則正常顯示其頁面     

總結:

 通過這篇部落格,為了跟接近實際情況,我們把資源角色資訊存放到資料庫中,為了方便而言,我們設計的表如下: test_resource:主要用來存放URL的。其中的欄位就一個URL varchar2(100) url test_resource_role:主要用來存放URL與對應的角色 varchar2(100) url,varchar2(50) role

PS:

 程式中用到sql查詢,其實就是表的所有欄位了,為了方便理解,沒有設計複雜的資料結構,其實無論你的表如何設計,最終只要返回其url對應的角色資訊,其返回值只要按照某種格式封裝即可。 思路:  為了定製自己專案需求,我們開始實現其提供的介面,但是往往這個時候我們如何實現,如何自定義,又如何返回呢?  其實,既然他對外提供了介面,他們通常有一種預設實現方式,我們只要參考其框架預設實現方式自定義即可哈。  比如我們定製logoutFilter,參考原有的logoutFilter;定製userdetailservicie,參考預設實現jdbcImpl;定製objectDefinitionSource,參考預設實現PathBasedFilterInvocationDefinitionMap類。

專案下載: