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

《Spring Security3》第四章第一部分翻译上(数据库管理信息)(转载)

阅读更多

这次上传的部分内容是入门级的,比较简单,但是本章整体的功能还是非常重要的。

 

 

第四章   凭证安全存储

到现在为止,我们已经将 JBCP Pets 站点做了一些用户友好性方面的升级,包括一个自定义的登录页、修改密码以及 remember me 功能。

 

在本章中,我们将会把到目前为止都在使用的内存存储转移到数据库作为后台的认证存储。我们将会介绍默认的 Spring Security 数据库 schema ,并介绍自定义扩展 JDBC 实现的方式。

 

在本章的课程中,我们将会:

l  理解如何配置 Spring Security 才能使用 JDBC 访问数据库服务以实现用户的存储和认证;

l  学习如何使用基于内存数据库 HSQLDB JDBC 配置,我们使用这个数据库主要是为了开发测试的目的;

l  使得 Spring Security JDBC 能够支持已经存在的遗留数据库 schema

l  掌握两种管理用户名和密码的功能,两者都会涵盖内置的和自定义的方式;

l  掌握配置密码编码的不同方法;

l  理解密码 salting 技术以提供更安全的方式存储密码;

l  持久化用户的 remember me token ,使得在服务器重启后 token 仍能有效;

l  通过配置 SSL/TLS 加密和端口映射,在传输层上保护应用的安全。

 

使用数据库后台的 Spring Security 认证

我们进行安全控制的 JBCP Pets 应用有一个明显问题是基于内存的用户名和密码存在时间比较短,对用户很不友好。一旦应用重启,任何的用户注册,密码修改或者其他的活动都会丢失。这是不可接受的,所以对于 JBCP Pets 应用的下一个逻辑实现功能就是重新设置 Spring Security 以使用关系型数据库来进行用户存储和授权。使用 JDBC 访问数据库能够使得用户的信息能够持久化,及时应用重启依旧有效,另外更能代表现实世界中 Spring Security 的使用。

配置位于数据库上的认证存储

这个练习的第一部分是建立一个基于 Java 的关系数据库 HyperSQL DB (或简写为 HSQL )示例,并装入 Spring Security 默认的 schema 。我们将会通过使用 Spring Security 的嵌入式数据库配置功能来设置 HSQL 在内存中运行,比起手动的安装数据库,这是一个很简单的配置方法。

 

请记住在这个例子中(包括本书的其余部分),我们将使用 HSQL ,主要是因为它很容易安装。在使用这些例子的过程中,我们鼓励修改这个配置以使用你喜欢的数据库。鉴于我们不想让本书的这一部分过多关注于复杂数据库的安装,对练习来说我们选择了更简便而不是更接近现实。

创建 Spring Security 默认的 schema

我们提供了一个 SQL 文件( security-schema.sql ),它将用来创建 Spring Security 使用 HSQL 所依赖的所有表。如果你使用自己的数据库实例,你可能会需要调整 schema 的定义语法来适应特定的数据库。我们会将 SQL 文件置于 classpath 中,在 WEB-INF/classes 目录下。

配置 HSQL 嵌入式数据库

要配置 HSQL 嵌入式的数据库,我们需要修改 dogstore-security.xml 文件,以实现启动数据库并运行 SQL 来创建 Spring Security 表结构。首先,我们将会在文件的顶部添加对 jdbc XML 模式的应用:

 

Xml代码  收藏代码
  1. < beans:beans   xmlns = "http://www.springframework.org/schema/security"   
  2.   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"   
  3.   xmlns:beans = "http://www.springframework.org/schema/beans"   
  4.   xmlns:jdbc = "http://www.springframework.org/schema/jdbc"   
  5.   xsi:schemaLocation ="  
  6.     http://www.springframework.org/schema/beans   
  7.     http://www.springframework.org/schema/beans/spring-beans.xsd  
  8.     http://www.springframework.org/schema/jdbc  
  9.     http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd  
  10.     http://www.springframework.org/schema/security   
  11.     http://www.springframework.org/schema/security/   
  12.           spring-security3.0.xsd"  
  13. >   

 接下来,我们声明 <embedded-database> 元素,以及对 SQL 脚本的引用:

 

Xml代码  收藏代码
  1. < jdbc:embedded-database   id = "dataSource"   type = "HSQL" >   
  2.   < jdbc:script   location = "classpath:security-schema.sql" />   
  3. </ jdbc:embedded-database >   

 如果此时重启服务,你可以在日志上看到初始化 HSQL 数据库。需要记住的是 <embedded-database> 只会在内存中创建数据库,所以你在内存中看不到任何东西,也不能使用标准的工具进行查询。

配置 JdbcDaoImpl 凭证存储

我们需要修改 dogstore-security.xml 文件来声明正在使用 JDBC UserDetailsService 实现,替换我们在第二章: Spring Security 起步 第三章:增强用户体验 中配置的 Spring Security 内存 UserDetailsService 实现。这通过一个对 <authentication-manager> 声明的一个简单改变来实现:

 

Xml代码  收藏代码
  1. < authentication-manager   alias = "authenticationManager" >   
  2.   < authentication-provider >   
  3.     < jdbc-user-service   data-source-ref = "dataSource" />   
  4.   </ authentication-provider >   
  5. </ authentication-manager >   

  data-source-ref 引用了我们在上一步声明 <embedded-database> 时定义的 bean 。】

添加用户定义到 schema

最后,我们要创建另外一个 SQL 文件,它将会在内存数据库创建时执行。这个 SQL 文件将会包含默认用户( admin guest )的信息,以及 GrantedAuthority 设置(这一点我们在前一章中已经用过了)。我们将这个文件命名为 test-data.sql ,并将其与 security-schema.sql 一起放在 WEB-INF/classes 下:

 

Sql代码  收藏代码
  1. insert   into  users(username,  password , enabled)  values    
  2.   ('admin' , 'admin' , true );  
  3. insert   into  authorities(username,authority)  values    
  4.   ('admin' , 'ROLE_USER' );  
  5. insert   into  authorities(username,authority)  values    
  6.   ('admin' , 'ROLE_ADMIN' );  
  7. insert   into  users(username,  password , enabled)  values    
  8.   ('guest' , 'guest' , true );  
  9. insert   into  authorities(username,authority)  values    
  10.   ('guest' , 'ROLE_USER' );  
  11. commit ;  

 接下来,我们需要添加这个 SQL 文件到嵌入式数据库配置中,它将会在启动时加载:

 

Xml代码  收藏代码
  1. < jdbc:embedded-database   id = "dataSource"   type = "HSQL" >   
  2.   < jdbc:script   location = "classpath:security-schema.sql" />   
  3.   < jdbc:script   location = "classpath:test-data.sql" />   
  4. </ jdbc:embedded-database >   

  SQL 添加到数据库配置后,我们应该能够启动应用并登录。 Spring Security 现在已经查找数据库的认证和 GrantedAuthority 信息。

 

基于数据库后台的认证是如何实现的

你可能会记起在第二章中讲述的认证过程, AuthenticationManager 委托 AuthenticationProvider 来校验安全实体的凭证信息以确定它是否能够访问系统。我们在第二章和第三章中使用的 AuthenticationProvider DaoAuthenticationProvider 。这个 provider 又委托了一个 UserDetailsService 的实现来从凭证库中检索和校验安全实体的信息。我们能够通过以下的图来反应第二章的过程:


 

正如你可能预期的那样,数据库后台的认证存储和内存存储的唯一区别在于 UserDetailsService 的实现类。 o.s.s.core.userdetails.jdbc.JdbcDaoImpl 类提供了 UserDetailsService 的实现。不同于在内存中(通过 Spring Security 的配置文件添加)查找, JdbcDaoImpl 在数据库中查找用户。



 你可能意识到我们根本没有引用这个实现类。这是因为在更新后的 Spring Security 配置中 <jdbc-user-service> 声明会自动配置 JdbcDaoImpl 并将其织入到 AuthenticationProvider 中。在本章接下类的内容中,我们将会介绍如何配置 Spring Security 使用我们自定义的 JdbcDaoImpl 实现,它继续包含了修改密码功能(在第三章中我们添加到 InMemoryDaoImpl 了)。让我们看一下如何实现自定义的支持修改密码功能的 JdbcDaoImpl 子类配置。

分享到:
评论

相关推荐

    Spring Security3中文文档

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

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

    《Spring Security3》第四章第四部分主要探讨了Remember me服务的后台存储机制以及如何结合SSL(Secure Sockets Layer)来增强应用的安全性。这一部分的知识点涵盖了Spring Security中Remember me的功能,用户身份...

    spring security3 中文版本

    Spring Security 3.0.1 是在 Spring Security 3.0 的基础上进行的一次 bug 修复版本,主要针对先前版本中存在的问题进行了修正。此次版本未引入新的功能,但修正了一些已知的问题,增强了稳定性。 ##### 1.4 获取 ...

    Spring Security in Action

    SecurityContext 是 Spring Security 中的一个重要概念,表示当前用户的安全上下文。SecurityContext 中包含用户的身份信息、权限信息等。SecurityContext 是通过 SecurityContextHolder 实现的。 五、Spring ...

    spring security 安全权限管理手册

    #### 第一部分:基础篇 ##### 第1章:一个简单的 HelloWorld 在这一章节中,我们将了解如何搭建一个最基础的 Spring Security 项目,并通过一个简单的示例来理解 Spring Security 的工作原理。 **1.1 配置过滤器*...

    Spring Security 资料合集

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理,它为Web应用和企业级应用提供了全面的安全服务。这个框架能够处理认证、授权以及各种安全相关的功能,帮助开发者构建安全、可扩展的应用。以下...

    springSecurity3例子

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

    spring security 官方文档

    Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,专注于身份验证、授权和访问控制。Spring Security的核心特性包括: 1. **身份验证...

    Spring Security3

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

    Spring Security权限管理开发手册

    - **第1章:一个简单的HelloWorld** - **配置过滤器:** 使用Spring Security提供的过滤器来实现基本的安全控制。 - **使用命名空间:** 通过XML配置文件中的命名空间简化Spring Security的配置过程。 - **完善...

    SpringSecurity笔记,编程不良人笔记

    SpringSecurity是Java领域中一款强大的安全框架,主要用于Web应用程序的安全管理。它提供了全面的身份验证、授权、会话管理以及安全相关的功能,可以帮助开发者构建安全的Web应用。在本笔记中,我们将深入探讨Spring...

    Spring Security 教程(Spring Security Tutorial)1

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

    springsecurity原理流程图.pdf

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

    SpringSecurity素材.rar

    SpringSecurity是Java领域中一款强大的安全框架,专为Spring和Spring Boot应用设计,提供全面的安全管理解决方案。在SpringBoot Web开发中,SpringSecurity扮演着核心角色,负责处理身份验证、授权以及访问控制等...

    Spring Security 文档

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

    SpringMVC集成SpringSecurity

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

    springsecurity使用demo

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

    一个比较好的spring security实例

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

Global site tag (gtag.js) - Google Analytics