《Spring Security3》第四章第一部分翻譯下(自定義的UserDetailsServic

建立一個自定義的JDBC UserDetailsService

com.packtpub.springsecurity.security包下建立以下的類:html

public class CustomJdbcDaoImpl extends JdbcDaoImpl implements 
IChangePassword {
  public void changePassword(String username, String password) {
    getJdbcTemplate() 
    update("UPDATE USERS SET PASSWORD = ? WHERE USERNAME = ?",
            password, username);
  }
}

你能夠看到這個類擴展了JdbcDaoImpl默認類,提供了按照用戶請求更新數據庫中密碼的功能。咱們使用標準的Spring JDBC模板完成這個功能。java

爲自定義的JDBC UserDetailsService添加Spring bean聲明

dogstore-base.xml配置文件中,添加以下的Spring Bean聲明:spring

<bean id="jdbcUserService" 
      class="com.packtpub.springsecurity.security.CustomJdbcDaoImpl">
  <property name="dataSource" ref="dataSource"/>
</bean>

一樣的,dataSource 的Bean引用指向了<embedded-database>聲明,咱們使用這個聲明來安裝HSQL內存數據庫。數據庫

你會發現自定義的UserDetailsService容許咱們與數據庫直接交互。在接下來的例子中,咱們將使用這個功能來擴展UserDetailsService的基本功能。在使用Spring Security的複雜應用中,這種類型的個性化是很常見的。jsp

基於JDBC的內置用戶管理post

正如上面簡單JdbcDaoImpl擴展所描述的那樣,開發人員可能會擴展這個類,但同時也會保留基本的功能。而咱們要實現更復雜功能時,如用戶註冊(online store所必須的)與用戶管理功能站點的管理員建立用戶更新密碼等,又會怎樣呢?spa

儘管這些功能借助JDBC語句都能相對容易的實現,可是Spring Security仍是爲咱們提供了內置的功能以支持對數據庫裏的用戶進行建立、讀取、更新和刪除的操做。這對簡單的系統來講是頗有用的,同時也爲構建自定義需求的用戶提供了很好的起點。code

實現類o.s.s.provisioning.JdbcUserDetailsManager擴展了JdbcDaoImpl的功能,提供了一些頗有用的與用戶相關的方法,這些方法的一部分在o.s.s.provisioning.UserDetailsManager接口中進行了定義:orm

正如你所見,JdbcUserDetailsManager的changePassword方法正好知足了咱們CustomJdbcDaoImpl的不足——在修改以前,它會檢驗用戶已存在密碼。讓咱們看一下將CustomJdbcDaoImpl替換爲JdbcUserDetailsManager須要怎樣的配置步驟。xml

首先,咱們須要在dogstore-base.xml中聲明JdbcUserDetailsManager bean

<bean id="jdbcUserService" 
      class="org.springframework.security 
             .provisioning.JdbcUserDetailsManager">
  <property name="dataSource" ref="dataSource"/>
  <property name="authenticationManager" 
            ref="authenticationManager"/>
</bean>

AuthenticationManager的引用要匹配咱們以前dogstore-security.xml文件中聲明的<authentication-manager>alias。不要忘記註釋掉CustomJdbcDaoImpl的聲明——咱們暫時不會使用它。

接下來,咱們須要對changePassword.jsp作一些小的調整:

<h1>Change Password</h1>
<form method="post">
  <label for="oldpassword">Old Password</label>:
  <input id="oldpassword" name="oldpassword" 
         size="20" maxlength="50" type="password"/>
  <br />
  <label for="password">New Password</label>:
  <input id="password" name="password" size="20" 
         maxlength="50" type="password"/>
  <br />

最後,須要簡單調整AccountController。將@Autowired引用IChangePassword的實現替換爲:

@Autowired
private UserDetailsManager userDetailsManager;

submitChangePasswordPage方法也會更加簡單了,由於要依賴的當前用戶信息將會由JdbcUserDetailsManager爲咱們肯定

public String submitChangePasswordPage(@RequestParam("oldpassword") 
       String oldPassword, 
  @RequestParam("password") String newPassword) {
  userDetailsManager.changePassword(oldPassword, newPassword);
  SecurityContextHolder.clearContext();
  return "redirect:home.do";
}

 在這些修改完成後,你能夠重啓應用並嘗試新的修改密碼功能。

注意當你沒有提供正確的密碼時將會發生什麼。試想一下會發生什麼?並嘗試思考怎樣調整能使得對用戶更友好。

儘管咱們沒有闡述JdbcUserDetailsManager提供的全部功能,可是能夠看出它能很容易與簡單的JSP頁面結合在一塊兒(固然要進行適當受權)以容許管理員來管理站點的用戶——這對產品級別的應用是必要的。

相關文章
相關標籤/搜索