acegi security實踐教程—把用戶信息存放到數據庫

概括:

  前幾篇博客中form驗證中用戶名稱、密碼都是存在內存中,爲了進一步完善,我們把用戶基本信息存放到數據庫中。
  基於內存形式如下:
       <!-- 從數據庫中讀取用戶信息驗證身份 -->
     <bean id ="daoAuthenticationProvider"
           class= "org.acegisecurity.providers.dao.DaoAuthenticationProvider" >
            <property name ="userDetailsService" ref= "inMemDaoImpl" />
     </bean >

    <!-- 基於內存實現方式-->
     <bean id ="inMemDaoImpl"
           class= "org.acegisecurity.userdetails.memory.InMemoryDaoImpl" >
            <property name ="userMap">
                 <value >
                     test=1,ROLE_USER
                     lisi=1,ROLE_SUPERVISOR
                     zhangsan=1,ROLE_SUPERVISOR,disabled
                 </value >
            </property >
     </bean >

分析:

  根據源碼,我們分析到userDetailService的實現類有兩個:InMemoryDaoImpl和JdbcDaoImpl,那這篇博客就嘗試用JdbcDaoImpl類。

具體開發步驟:

  開發環境:MyEclispe10.7.1+tomcat6.0.37+acegi1.0.5+spring2.0
  項目目錄如下:  其中readme主要用來記錄本次驗證目的

講解:

  1.根據JdbcDaoImpl源碼來配置acegi
  通過源碼發現,JdbcDaoImpl默認情況下,執行這兩個查詢。 
  usersByUsernameQuery 根據用戶名查詢用戶基本信息:用戶名、密碼、是否啓用   
this.usersByUsernameQuery = "SELECT username,password,enabled FROM users WHERE username = ?";
  authoritiesByUsernameQuery根據用戶名查詢用戶權限信息:用戶名、角色權限
this.authoritiesByUsernameQuery = "SELECT username,authority FROM authorities WHERE username = ?";
  所以,您的數據庫中必須有這兩個表以及相應的字段。
  2.JdbcDaoImpl繼承了spring的JdbcDaoSupport類,其中spring的JdbcDaoSuupport類如下:
  分析注入dataSource數據源:
  通過springJdbcDaoSupport類,是需要注入一個數據源對象。具體瞭解一下,從源碼哪裏可以看出需要注入數據源呢,spring的注入配置,主要觀察類代碼。
  
  
  
   根據上圖的分析,可以配置,通過jdbcTemplate屬性注入dataSource對象。如下配置:

  <bean id="userDetailsService"
class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="jdbcTemplate" ref="JdbcTemplate"> </property>
</bean>
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource"></property>
</bean>

  其實根據源碼的分析,也可以這麼配置,不用jdbcTemplate屬性,而是直接注入dataSource對象。
 <bean id="userDetailsService"
        class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
         <property name="dataSource" ref="dataSource"></property>
</bean>

  我們繼續觀察JdbcDaoSupport類,還是剛纔那幅圖
  
  至於兩種實現方案的優缺點,暫時沒有研究,也許因爲效率問題。
  所以完整的配置如下:
  使用jdbcTemplate屬性注入dataSource
  直接注入dataSource
  配置完成後,即可運行項目,這樣,獲取的用戶基本信息以及權限信息都來自數據庫。
  

  自定義方式數據結構

  剛纔JdbcDaoImpl使用默認配置方式,這樣話,用戶就必須按照默認的配置方式新建相應的表以及字段。但是一般情況下,自己的系統都有自己的表結構或表名稱。比如用戶基本信息表名稱就是test_user而不是users咋辦呢?
  其實JdbcDaoImpl早已替我們想好了,他對外提供了兩個屬性,
  private String authoritiesByUsernameQuery;
  private String usersByUsernameQuery;
  默認情況下,通過構造方法賦值默認查詢語句。但是既然對外提供set方法,那麼用戶可以自定義其語句了。
  配置方式如下:
   <bean id="userDetailsService"
class="org.acegisecurity.userdetails.jdbc.JdbcDaoImpl">
<property name="jdbcTemplate" ref="JdbcTemplate"> </property>
<!-- 配置查詢條件 -->
<property name="usersByUsernameQuery"> 
<value>
 select t.user_name,t.pwd,t.enabled from test_user t where t.user_name=?
</value>
</property>
<property name="authoritiesByUsernameQuery">
   <value>
    select t.user_name,t.auths from test_auths t where t.user_name=?
   </value>
</property>
</bean>
<bean id="JdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource"></property>
</bean>

  我自定義的用戶信息test_user表,用戶權限表test_auths.只要提供相應的字段即可,至於字段名稱是否相同這個不是關鍵。

  項目下載:

  項目源碼中是JdbcDaoImpl默認的配置方式,若想自定義可以根據博客進行相應配置。

  PS:

  項目中的spring配置數據源方式,可以參考以前博客《spring配置數據源四種方式

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