`
lengyun3566
  • 浏览: 446799 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
D59180b9-02f1-3380-840c-ea34da46143c
《Spring Secur...
浏览量:379329
社区版块
存档分类
最新评论

《Spring Security3》第三章第四部分翻译(修改密码)

阅读更多

 

实现修改密码管理

现在我们将要对基于内存的UserDetailsService进行简单的扩展以使其支持用户修改密码。因为这个功能对用户名和密码存于数据库的场景更有用,所以基于o.s.s.core.userdetails.memory.InMemoryDaoImpl扩展的实现不会关注存储机制,而是关注框架对这种方式扩展的整体流程和设计。在第四章中,我们将通过将其转移到数据库后台存储来进一步扩展我们的基本功能。

扩展基于内存的凭证存储以支持修改密码

Spring Security框架提供的InMemoryDaoImpl内存凭证存储使用了一个简单的map来存储用户名以及关联的UserDetailsInMemoryDaoImpl使用的UserDetails实现类是o.s.s.core.userdetails.User,这个实现类将会在Spring Security API中还会看到。

 

这个扩展的设计有意的进行了简化并省略了一些重要的细节,如需要用户在修改密码前提供他们的旧密码。添加这些功能将作为练习留给读者。

InMemoryChangePasswordDaoImpl扩展InMemoryDaoImpl

我们要首先写自定义的类来扩展基本的InMemoryDaoImpl,并提供允许用户修改密码的方法。因为用户是不可改变的对象,所以我们copy已经存在的User对象,只是将密码替换为用户提交的值。在这里我们定义一个接口在后面的章节中将会重用,这个接口提供了修改密码功能的一个方法:

 

package com.packtpub.springsecurity.security;
// imports omitted
public interface IChangePassword extends UserDetailsService {  
void changePassword(String username, String password);
}

 以下的代码为基于内存的用户数据存储提供了修改密码功能:

 

package com.packtpub.springsecurity.security;
public class InMemoryChangePasswordDaoImpl extends InMemoryDaoImpl 
implements IChangePassword {
  @Override
  public void changePassword(String username, 
                String password) {
    // get the UserDetails
    User userDetails = 
        (User) getUserMap().getUser(username);
    // create a new UserDetails with the new password
    User newUserDetails = 
        new User(userDetails.getUsername(),password,
        userDetails.isEnabled(), 
        userDetails.isAccountNonExpired(),
      userDetails.isCredentialsNonExpired(),
        userDetails.isAccountNonLocked(),
        userDetails.getAuthorities());
    // add to the map
    getUserMap().addUser(newUserDetails);
  }
}

 比较幸运的是,只有一点代码就能将这个简单的功能加到自定义的子类中了。我们接下来看看添加自定义UserDetailsServicepet store应用中会需要什么样的配置。

配置Spring Security来使用InMemoryChangePasswordDaoImpl

现在,我们需要重新配置Spring SecurityXML配置文件以使用新的UserDetailsService实现。这可能比我们预想的要困难一些,因为<user-service>元素在Spring Security的处理过程中有特殊的处理。需要明确声明我们的自定义bean并移除我们先前声明的<user-service>元素。我们需要把:

 

<authentication-manager alias="authenticationManager">
  <authentication-provider>
    <user-service id="userService">
      <user authorities="ROLE_USER" name="guest" password="guest"/>
    </user-service>
  </authentication-provider>
</authentication-manager>

 修改为:

 

<authentication-provider user-service-ref="userService"/>

 在这里我们看到的user-service-ref属性,引用的是一个iduserServiceSpring Bean。所以在dogstore-base.xml Spring Beans配置文件中,声明了如下的bean

 

<bean id="userService" class="com.packtpub.springsecurity.security.
InMemoryChangePasswordDaoImpl">
  <property name="userProperties">
    <props>
      <prop key="guest">guest,ROLE_USER</prop>
    </props>
  </property>
</bean>

 你可能会发现,这里声明用户的语法不如<user-service>包含的<user>元素更易读。遗憾的是,<user>元素只能使用在默认的InMemoryDaoImpl实现类中,我们不能在自定义的UserDetailsService中使用了。在这里例子中,这个限制使得事情稍微复杂了一点,但是在实际中,没有人会愿意长期的将用户定义信息放在配置文件中。对于感兴趣的读者,Spring Security 3参考文档中的6.2节详细描述了以逗号分隔的提供用户信息的语法。

【高效使用基于内存的UserDetailsService。有一个常见的场景使用基于内存的UserDetailsService和硬编码的用户列表,那就是编写安全组件的单元测试。编写单元测试的人员经常编码或配置最简单的场景来测试组件的功能。使用基于内存的UserDetailsService以及定义良好的用户和GrantedAuthority值为测试编写人员提供了很可控的测试环境。】

 

到现在,你可以重启JBCP Pets应用,应该没有任何的配置错误报告。我们将在这个练习的最后的两步中,完成UI的功能。

构建一个修改密码的页面

我们接下来将会建立一个允许用户修改密码的简单页面。



 这个页面将会通过一个简单的链接添加到“My Account”页面。首先,我们在/account/home.jsp文件中添加一个链接:

 

<p>
  Please find account functions below...
</p>
<ul>
  <li><a href="changePassword.do">Change Password</a></li>
</ul>

 接下来,在/account/ changePassword.jsp文件中建立“Change Password”页面本身:

 

<?xml version="1.0" encoding="ISO-8859-1" ?>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<jsp:include page="../common/header.jsp">
  <jsp:param name="pageTitle" value="Change Password"/>
</jsp:include>
<h1>Change Password</h1>
<form method="post">
  <label for="password">New Password</label>:
  <input id="password" name="password" size="20" maxlength="50" 
type="password"/>
  <br />
  <input type="submit" value="Change Password"/> 
</form>
<jsp:include page="../common/footer.jsp"/>
 

 

最后我们还要添加基于Spring MVCAccountController来处理密码修改的请求(在前面的章节中我们没有介绍AccountController,它是账号信息主页的简单处理类)。

AccountController添加修改密码的处理

我们需要将对自定义UserDetailsService的应用注入到com.packtpub.springsecurity.web.controller.AccountController,这样我们就能使用修改密码的功能了。Spring@Autowired注解实现了这一功能:

 

@Autowired
private IChangePassword changePasswordDao;

 两个接受请求的方法分别对应渲染form以及处理POST提交的form数据:

 

@RequestMapping(value="/account/changePassword.
do",method=RequestMethod.GET)
public void showChangePasswordPage() {  
}
@RequestMapping(value="/account/changePassword.
do",method=RequestMethod.POST)
public String submitChangePasswordPage(@RequestParam("password") 
String newPassword) {
  Object principal = SecurityContextHolder.getContext().
getAuthentication().getPrincipal();
  String username = principal.toString();
  if (principal instanceof UserDetails) {
username = ((UserDetails)principal).getUsername();
}
  changePasswordDao.changePassword(username, newPassword);
  SecurityContextHolder.clearContext();
  return "redirect:home.do";
}

 完成这些配置后,重启应用,并在站点的“My Account”下找到“Change Password”功能。

练习笔记

比较精细的读者可能意识到这个修改密码的form相对于现实世界的应用来说太简单了。确实,很多的修改密码实现要复杂的多,并可能包含如下的功能:

l  密码确认——通过两个文本框,确保用户输入的密码是正确的;

l  旧密码确认——通过要求用户提供要修改的旧密码,增加安全性(这对使用remember me功能的场景特别重要);

l  密码规则校验——检查密码的复杂性以及密码是否安全。

 

你可能也会注意到当你使用这个功能的时,会被自动退出。这是因为SecurityContextHolder.clearContext()调用导致的,它会移除用户的SecurityContext并要求他们重新认证。在练习中,我们需要给用户做出提示或者找到方法让用户免于再次认证。

小结

在本章中,我们更细节的了解了认证用户的生命周期并对JBCP Pet  Store进行了结构性的修改。我们通过添加真正的登录和退出功能,进一步的满足了安全审计的要求,并提升了用户的体验。我们也学到了如下的技术:

l  配置并使用基于Spring MVC的自定义用户登录界面;

l  配置Spring Security的退出功能;

l  使用remember me功能;

l  通过记录IP地址,实现自定义的remember me功能;

l  实现修改密码功能;

l  自定义UserDetailsServiceInMemoryDaoImpl

在第四章中,我们将会使用基于数据库的认证信息存储并学习怎样保证数据库中的密码和其他敏感数据的安全。

  • 大小: 21.9 KB
5
2
分享到:
评论
2 楼 zhonghuafy 2011-07-19  
感谢楼主的翻译!非常好。不知楼主有没有英文版的电子书,可否发给我一份?Zhonghuafy@gmail.com。

等楼主翻译完,可以联系原作者商议出版。或者做成pdf格式的电子文档。any way,谢谢你的工作!
1 楼 xosadan 2011-07-09  
谢谢分享。。

相关推荐

    springSecurity3中文文档

    第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...

    《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)附前四章doc文件

    NULL 博文链接:https://lengyun3566.iteye.com/blog/1141347

    spring security 参考手册中文版

    第四部分 Web应用程序安全 112 13.安全过滤器链 112 13.1 DelegatingFilterProxy 112 13.2 FilterChainProxy 113 13.2.1绕过滤网链 115 13.3过滤器排序 115 13.4请求匹配和HttpFirewall 116 13.5与其他基于过滤器的...

    jwt-spring-security-demo:一个在Spring Security和Spring Boot 2中使用JWT(Json Web令牌)的演示

    后端存在三个用户帐户,以说明对API中的端点的不同访问级别以及不同的授权例外: Admin - admin:adminUser - user:passwordDisabled - disabled:password (this user is deactivated)该演示有四个合理的端点:...

    Spring in Action(第2版)中文版

    第3章高级bean装配 3.1声明父bean和子bean 3.1.1抽象基bean类型 3.1.2抽象共同属性 3.2方法注入 3.2.1基本的方法替换 3.2.2获取器注入 3.3注入非springbean 3.4注册自定义属性编辑器 3.5使用spring的特殊...

    Spring in Action(第二版 中文高清版).part2

    第三部分 Spring客户端 第13章 处理Web请求 13.1 开始Spring MVC之旅 13.1.1 请求生命中的一天 13.1.2 配置DispatcherServlet 13.1.3 Spring MVC概述 13.2 将请求映射到控制器 13.2.1 使用SimpleUrlHandler ...

    Spring in Action(第二版 中文高清版).part1

    第三部分 Spring客户端 第13章 处理Web请求 13.1 开始Spring MVC之旅 13.1.1 请求生命中的一天 13.1.2 配置DispatcherServlet 13.1.3 Spring MVC概述 13.2 将请求映射到控制器 13.2.1 使用SimpleUrlHandler ...

    spring-boot示例项目

    Spring Boot为Spring平台及第三方库提供开箱即用的设置,这样你就可以有条不紊地开始。多数Spring Boot应用只需要很少的Spring配置。 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Sprin

    全开源JAVA支付系统/jeepay聚合支付四方支付系统

    全开源JAVA支付系统/jeepay聚合支付四方支付系统 ...使用Spring Security实现权限管理; 前后端分离架构,方便二次开发; 由原XxPay团队开发,有着多年支付系统开发经验。 搭建安装方式具体看文件包,带开发文档。

    springone2019:2019年Spring第一阶段的演示步骤

    OAuth 2.0和Spring Security的多租户 此仓库由四个使用和保护的应用程序组成。 为了使应用程序正常工作,请在克隆到本地计算机后执行以下步骤: 修改/ etc / hosts文件 该演示代码指向身份提供者的端点idp:9999 。...

    yshop前后端分离商城系统 v3.2 拼团砍价秒杀+新增商品积分兑换模块+新增商城装修模块

    yshop前后端分离商城系统是SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统 功能: 一、商品模块:商品添加、规格设置,商品上下架等 二、订单模块:下单、购物车、支付,发货、...

    基于java的流行技术组合的前后端分离商城系统

    SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含商城、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员、充值、多门店等功能,更适合企业或个人二次开发。 功能: 一、...

    计算机软件项目设计方案(2020).docx

    在技术架构设计上,LEAF6平台以Java EE体系和Spring核心框架为基础,采用Spring MVC结合Spring Security完成权限验证和请求控制服务,使用AOP切面计算机软件项目设计方案(2020)全文共10页,当前为第3页。...

    基于jbpm与activiti的工作流平台技术架构介绍

    系统的安全管理由Spring Security 3提供配置及管理,非常容易与第三方的用户或认证平台进行整合,如与CAS服务器作统一认证,只需要加上新的配置模块即可实现,不影响系统现有的功能模块。大大满足了各种不同系统的...

    mallcloud商城-其他

    3、深度定制Spring Security真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案 4、提供应用管理,方便第三方系统接入 5、引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易 6、注重...

    Note_scalad.tar.gz

    springSecurity springmvc_HandlerInterceptorAdapter swagger uuid 灰度发布 全国60岁以上的老人进行了这样一次问卷调查:你最后悔什么? 第一名:年轻时不够努力,导致一事无成(75%) 第二名:年轻的时候选错了职业...

    mallcloud商城 v1.0

    3、深度定制Spring Security真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案 4、提供应用管理,方便第三方系统接入 5、引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易 6、注重...

    【yshop前后端分离商城系统 v3.2】拼团砍价秒杀+新增商品积分兑换模块+新增商城装修模块

    SpringBoot2+MybatisPlus+SpringSecurity+jwt+redis+Vue的前后端分离的商城系统, 包含商城、拼团、砍价、商户管理、 秒杀、优惠券、积分、分销、会员、充值、多门店等功能,更适合企业或个人二次开发。 功能: 一、...

    基于Java+Springboot+MySQL+Thymeleaf 架构的电影聚合系统源码+数据库+项目说明.zip

    #### 三、项目技术 * Spring && Spring Boot && Spring Sectuity * Spring Data Jpa * EsayUI + Bootstrap * thymeleaf * ckeditor * 运行截图 ![film]...

    java开源包3

    同时,任何第三方都可以使用OAUTH认证服务,任 何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。业界提供了OAUTH的多种实现如PHP,JavaScript,Java,Ruby等各种语言开发包,大大节约了程序员的时间...

Global site tag (gtag.js) - Google Analytics