《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页面结合在一块儿(固然要进行适当受权)以容许管理员来管理站点的用户——这对产品级别的应用是必要的。

相关文章
相关标签/搜索