`
kong0itey
  • 浏览: 306127 次
社区版块
存档分类
最新评论

《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService)(转载)

阅读更多

实现自定义的JDBC UserDetailsService

正如在前面章节中的那个练习,我们将以基本的 JdbcDaoImpl 作为起点,将其进行扩展以支持修改密码功能。

创建一个自定义的 JDBC UserDetailsService

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

 

Java代码  收藏代码
  1. public   class  CustomJdbcDaoImpl  extends  JdbcDaoImpl  implements    
  2. IChangePassword {  
  3.   public   void  changePassword(String username, String password) {  
  4.     getJdbcTemplate()   
  5.     update("UPDATE USERS SET PASSWORD = ? WHERE USERNAME = ?" ,  
  6.             password, username);  
  7.   }  
  8. }  

 你可以看到这个类扩展了 JdbcDaoImpl 默认类,提供了按照用户请求更新数据库中密码的功能。我们使用标准的 Spring JDBC模板 完成这个功能。

 

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

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

 

Xml代码  收藏代码
  1. < bean   id = "jdbcUserService"    
  2.       class = "com.packtpub.springsecurity.security.CustomJdbcDaoImpl" >   
  3.   < property   name = "dataSource"   ref = "dataSource" />   
  4. </ 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 接口中进行了定义:

方法

描述

void createUser(UserDetails user)

根据给定的 UserDetails 创建一个新用户,并包含所有声明的 GrantedAuthority

void updateUser(final UserDetails user)

根据给定的 UserDetails 更新一个用户。更新其 GrantedAuthority 并将其从用户缓存中清除。

void deleteUser(String username)

根据给定的用户名删除用户,并将其从用户缓存中清除。

boolean userExists(String username)

根据给定的用户名判断用户是否存在(不管是否可用)。

void changePassword(String oldPassword, String newPassword)

修改当期登录用户的密码。为了使得操作成功,用户必须提供正确的当期密码。

 

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

 

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

 

Xml代码  收藏代码
  1. < bean   id = "jdbcUserService"    
  2.       class ="org.springframework.security   
  3.              .provisioning.JdbcUserDetailsManager">   
  4.   < property   name = "dataSource"   ref = "dataSource" />   
  5.   < property   name = "authenticationManager"    
  6.             ref = "authenticationManager" />   
  7. </ bean >   

  AuthenticationManager 的引用要匹配我们之前 dogstore-security.xml 文件中声明的 <authentication-manager> alias 。不要忘记注释掉 CustomJdbcDaoImpl 的声明——我们暂时不会使用它。

 

 

接下来,我们需要对 changePassword.jsp 做一些小的调整:

 

Html代码  收藏代码
  1. < h1 > Change Password </ h1 >   
  2. < form   method = "post" >   
  3.   < label   for = "oldpassword" > Old Password </ label > :  
  4.   < input   id = "oldpassword"   name = "oldpassword"    
  5.          size = "20"   maxlength = "50"   type = "password" />   
  6.   < br   />   
  7.   < label   for = "password" > New Password </ label > :  
  8.   < input   id = "password"   name = "password"   size = "20"    
  9.          maxlength = "50"   type = "password" />   
  10.   < br   />   

 

 最后,需要简单调整 AccountController 。将 @Autowired 引用 IChangePassword 的实现替换为:

 

Java代码  收藏代码
  1. @Autowired   
  2. private  UserDetailsManager userDetailsManager;  

 

 submitChangePasswordPage 方法也会更加简单了,因为要依赖的当前用户信息将会由 JdbcUserDetailsManager 为我们确定:

 

Java代码  收藏代码
  1. public  String submitChangePasswordPage( @RequestParam ( "oldpassword" )   
  2.        String oldPassword,   
  3.   @RequestParam ( "password" ) String newPassword) {  
  4.   userDetailsManager.changePassword(oldPassword, newPassword);  
  5.   SecurityContextHolder.clearContext();  
  6.   return   "redirect:home.do" ;  
  7. }  

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

 

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

 

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

分享到:
评论

相关推荐

    Spring Security3中文文档

    ### 第一章:Spring Security3入门 该章节分为两个部分,介绍了Spring Security3的基础概念,包括如何设置安全上下文、理解Spring Security的架构以及如何使用Spring Security进行基本的认证和授权。 ### 第二章:...

    spring security3 中文版本

    自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...

    SpringSecurity笔记,编程不良人笔记

    1. **SpringSecurity核心概念** - **Filter Chain**: SpringSecurity通过一系列过滤器实现其安全功能,这些过滤器构成了Filter Chain。每个过滤器负责特定的安全任务,如认证、授权等。 - **Authentication**: ...

    springSecurity3例子

    - Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...

    SpringSecurity素材.rar

    3. **用户认证**:详细阐述如何实现用户登录功能,包括自定义UserDetailsService以加载用户信息,以及使用内存、数据库或其他数据源存储用户凭据。同时,可能会介绍基于表单登录、JWT令牌认证等多种认证方式。 4. *...

    spring security第一个项目

    在“spring security第一个项目”中,我们将探讨如何搭建一个基础的Spring Security环境,实现用户登录验证以及权限控制。 首先,我们需要理解Spring Security的基本架构。它由四个主要组件组成:Filter Security ...

    springsecurity原理流程图.pdf

    Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架,它是安全领域中Spring生态系统的一部分。Spring Security旨在为Java应用程序提供一个全面的安全解决方案,尤其适用于企业级应用场景。它主要...

    Spring Security3

    #### 第一章:一个不安全应用的剖析 **安全审计** - **目的**:识别系统中的安全隐患,并评估安全措施的有效性。 - **过程**:通过模拟攻击来测试系统的安全性,分析日志记录,评估现有安全策略。 **样例应用简介*...

    Spring Security 教程(Spring Security Tutorial)1

    - 学习 Spring Security 的第一步通常是创建一个简单的 "Hello World" 应用,这通常涉及添加必要的依赖和配置,以便启动基础的安全功能。 3. **单元测试**: - 在安全相关的开发中,单元测试是必不可少的,因为它...

    SpringMVC集成SpringSecurity

    1. **SpringSecurity架构**:SpringSecurity的核心架构由多个组件构成,包括过滤器链、认证管理、权限控制等。其中,过滤器链是SpringSecurity处理请求的第一道防线,它会拦截所有HTTP请求并进行安全检查。 2. **...

    Spring Security 文档

    在第一种方法中,Spring Security的示例项目`spring-security-samples-tutorial-3.0.2.RELEASE`提供了硬编码配置的参考,它演示了如何在XML配置文件中定义用户、密码和权限。这种方法适合初学者快速了解Spring ...

    一个比较好的spring security实例

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制等功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在这个名为 "mysecurity" 的压缩包中,很可能是...

    springsecurity使用demo

    SpringSecurity 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本示例中,我们将探讨如何使用 SpringSecurity 构建一个基本的认证和授权流程。 首先,Spring Security 的核心...

    spring security 安全权限管理手册

    ##### 第4章:自定义登录页面 **4.1 实现自定义登录页面** Spring Security 允许我们定制登录界面,包括样式、布局等。首先,需要创建一个 HTML 页面作为登录页,并在配置文件中指定登录页的位置。 ```xml ...

    springsecurity3x快速构建企业级安全

    - Spring Security 3.x也可以与OAuth2协议集成,支持第三方服务的授权,提供安全的API访问。 8. **自定义扩展** - Spring Security的灵活性允许开发者根据需求自定义认证和授权策略,可以通过实现接口或继承类来...

    SpringBoot + SpringSecurity + JPA 实现用户角色权限登录认证

    在SpringSecurity的配置中,会定义一个自定义的AuthenticationProvider来处理用户的登录认证,以及UserDetailsService来获取用户信息。此外,还需要配置HttpSecurity以拦截特定URL,根据用户的角色和权限决定是否...

    spring-security-helloworld

    "级别的项目通常是编程初学者的第一步,而“入门”则表明这适用于那些初次接触Spring Security的人。标签中的“spring security”是核心关键词,指的是这个项目将围绕Spring Security框架进行,帮助新手了解其工作...

    spring-security 案例

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。它为Web应用程序和企业级应用提供了全面的安全解决方案。在这个“spring-security”案例中,我们将深入探讨Spring Security...

    Spring Security 源码

    Spring Security 是一个强大的和高度可定制的身份验证和访问控制框架,用于Java应用程序。它提供了全面的安全解决方案,包括用户认证、授权、CSRF防护、会话管理等。在深入研究Spring Security的源码之前,我们需要...

    springsecurity入门实例

    3. **过滤器链**:Spring Security 使用一系列过滤器来拦截请求并执行安全逻辑,如 `AuthenticationFilter` 和 `AuthorizationFilter`。 **二、设置项目** 1. **添加依赖**:在 Maven 或 Gradle 项目中添加 Spring...

Global site tag (gtag.js) - Google Analytics