2019独角兽企业重金招聘Python工程师标准>>> hot3.png

创建一个自定义的JDBC UserDetailsService

com.packtpub.springsecurity.security包下创建如下的类:

102209_wrus_1417419.png

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模板完成这个功能。

为自定义的JDBC UserDetailsService添加Spring bean声明

dogstore-base.xml配置文件中,添加如下的Spring Bean声明:

102339_xPg4_1417419.png

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

同样的,dataSource 的Bean引用指向了<embedded-database>声明,我们使用这个声明来安装HSQL内存数据库。

你会发现自定义的UserDetailsService允许我们与数据库直接交互。在接下来的例子中,我们将使用这个功能来扩展UserDetailsService的基本功能。在使用Spring Security的复杂应用中,这种类型的个性化是很常见的。

基于JDBC的内置用户管理

正如上面简单JdbcDaoImpl扩展所描述的那样,开发人员可能会扩展这个类,但同时也会保留基本的功能。而我们要实现更复杂功能时,如用户注册(online store所必须的)与用户管理功能站点的管理员创建用户更新密码等,又会怎样呢?

尽管这些功能借助JDBC语句都能相对容易的实现,但是Spring Security还是为我们提供了内置的功能以支持对数据库里的用户进行创建、读取、更新和删除的操作。这对简单的系统来说是很有用的,同时也为构建自定义需求的用户提供了很好的起点。

实现类o.s.s.provisioning.JdbcUserDetailsManager扩展了JdbcDaoImpl的功能,提供了一些很有用的与用户相关的方法,这些方法的一部分在o.s.s.provisioning.UserDetailsManager接口中进行了定义:

102658_XrBf_1417419.png

正如你所见,JdbcUserDetailsManager的changePassword方法正好满足了我们CustomJdbcDaoImpl的不足——在修改之前,它会检验用户已存在密码。让我们看一下将CustomJdbcDaoImpl替换为JdbcUserDetailsManager需要怎样的配置步骤。

首先,我们需要在dogstore-base.xml中声明JdbcUserDetailsManager bean

102851_Ewcb_1417419.png

<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做一些小的调整:

103016_eC0j_1417419.png

<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为我们确定

103312_wUsr_1417419.png

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

在这些修改完成后,你可以重启应用并尝试新的修改密码功能。

注意当你没有提供正确的密码时将会发生什么。试想一下会发生什么?并尝试思考怎样调整能使得对用户更友好。

尽管我们没有阐述JdbcUserDetailsManager提供的所有功能,但是可以看出它能很容易与简单的JSP页面结合在一起(当然要进行适当授权)以允许管理员来管理站点的用户——这对产品级别的应用是必要的。

转载于:https://my.oschina.net/heroShane/blog/197705

《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsServic相关推荐

  1. 使用Spring Security3的四种方法概述

    使用Spring Security3的四种方法概述 那么在Spring Security3的使用中,有4种方法: 一种是全部利用配置文件,将用户.权限.资源(url)硬编码在xml文件中,已经实现过, ...

  2. 如何建立图像数据矩阵和图像显示灰度之间的关系!_放射技术考试第四章第一节 数字图像的特征...

    第四章第一节   数字图像的特征 一.模拟与数字 (一)模拟信号 在信息科学中,能够计数的离散量称为数字信号(整数),不能计数的连续量称为模拟信号. 模拟是以某种范畴的表达方式如实地反映另一种范畴.例 ...

  3. 第四章 第一节:函数下

    Python基础入门(全套保姆级教程) 第四章 第一节:函数下 def wrapper(fn):def inner(*args, **kwargs);ret = fn(*args, **kwargs) ...

  4. 数学:确定性的丧失---第四章 第一场灾难:真理的丧失

    发信人: paradax (秀树*冬眠中...), 信区: Philosophy 标  题: 数学:确定性的丧失(5) 发信站: 北大未名站 (2002年10月23日22:34:43 星期三), 转信 ...

  5. Prism4文档翻译(第四章 第一部分) 转载bluesky234

    本节导读: 第四章介绍了模块化应用程序开发所必要的知识和需要注意的内容.而本部分通过讲述模块化应用程序开发所注意的必要概念,包括IModule接口,模块加载过程,模块列表,模块间通信,和依赖注入容器, ...

  6. Spring MVC 第四章:Form表单验证-JSR303和Spring框架验证以及国际化语言、Filter过滤器

    Form表单的验证验证,就是在提交表单的时候进行验证是否为空,是否满足特定条件才可以创建.常见的表单有前端验证和后端验证. 其中,前端验证有:HTML验证,JS验证,Jquery验证. 后端验证有:J ...

  7. Spring Cloud第四章:熔断器Hystrix

    在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用.为了保证其高可用,单个服务 ...

  8. 汇编语言学习——第四章 第一个汇编程序

    1.一个汇编语言程序从写出到最终执行的简要过程: 编写--> 编译,链接 --> 执行 2.编译,链接 使用汇编语言编译程序(MASM.EXE)对源程序文件中的源程序进行编译,产生目标文件 ...

  9. 汇编语言-第四章 第一个程序

    2019独角兽企业重金招聘Python工程师标准>>> 一个源程序从写出到执行的过程 编写汇编源程序 对源程序进行编译链接 1.使用 汇编语言编译程序对源程序文件中的源程序进行编译, ...

最新文章

  1. 得到文件的服务器路径,如何获取服务器上的路径?
  2. 操作系统第二章 进程管理
  3. 基于ECLIPSE的C++环境配置。。
  4. Kotlin的高阶函数和常用高阶函数
  5. 信息学奥赛一本通(1069:乘方计算)
  6. PHP(2):搭建PHP 运行环境中可能出现的问题及处理方法
  7. fx5u mc协议_SLMP协议和MC协议
  8. php删除记录图片吗,php 删除记录同时删除图片文件的实现代码_PHP教程
  9. 计算机开机后无法网络拨号怎样处理,电脑不能拨号上网显示调制解调器已删除怎么办...
  10. SSH框架报 org.hibernate.impl.QueryImpl cannot be cast to com.gao.ruan.pojos.Category
  11. 无线网460王者荣耀服务器,王者荣耀:如何解决大批玩家网络460?骨灰级玩家给出了最终方案...
  12. JavaScript-2:初体验JS
  13. ajax使用post函数(通过远程 HTTP POST 请求载入信息)
  14. 为什么说DAO是未来的公司形式
  15. “晓白”学python-科普篇(2)-人们都用python做什么?
  16. Linux介绍以及常用操作命令
  17. 【EduCoder实训答案】大数据系统及应用-HDFS实训
  18. 机器语言-汇编语言-高级语言各自优缺点
  19. 计算机安全在医学中的重要性,试议计算机技术在医学中的意义
  20. 细说java.util.HashMap

热门文章

  1. 字节数与字符数mysql_mysql 数值与字符类型 长度梳理
  2. coreos 搭建PHP,Linux_用Mac在CoreOS上搭建WordPress的教程,作者以自己的Mac笔记本为例, - phpStudy...
  3. 20200606:最长连续序列(leetcode128)
  4. linux neo4j weget,关于在linux中安装neo4j的步骤
  5. ajax请求携带tooken_当ajax碰到token的时候
  6. 使用si ob 导出,导入部分表
  7. [vb] Set 语句
  8. Facebook秘密文件泄露:赚钱(和背锅)是AI的使命
  9. 无人车是怎样一步步学会开车的? | 自动驾驶科普
  10. AlphaZero完胜三大世界冠军棋类程序:5000个TPU、自学一天