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

《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)

阅读更多

 

Remember me 功能迁移至数据库

          现在你可能会意识到我们 remember me 功能的实现,能够在应用重启前很好的使用,但在应用重启时用户的 session 会被丢失。这对用户来说会不太便利,他们不应该关心 JBCP Pets 的维护信息。

          幸运的是, Spring Security 提供了将 rememberme token 持久化到任何存储的接口 o.s.s.web.authentication.rememberme.PersistentTokenRepository ,并提供了这个接口的 JDBC 实现。

配置基于数据库的 remember me tokens

          在这里,修改 remember me 的配置以持久化到数据库是非常简单的。 Spring Security 配置的解析器能够识别出 <remember-me> 声明的 data-source-ref 新属性并为 RememberMeServices 切换实现类。让我们了解完成这个功能所需要的步骤。

添加 SQL 以创建 remember me schema

          我们需要将包含期望 schema 定义的 SQL 文件放在 classpath 下( WEB-INF/classes 中),它会与我们在前面使用的其它启动 SQL 脚本放在一起。我们将这个 SQL 脚本命名为 remember-me-schema.sql

 

Sql代码  收藏代码
  1. create   table  persistent_logins (  
  2.   username varchar_ignorecase(50) not   null ,   
  3.   series varchar (64)  primary   key ,  
  4.   token varchar (64)  not   null ,   
  5.   last_used timestamp   not   null );  
 

 

为嵌入式数据库声明添加新的 SQL 脚本

          接下来,在 dogstore-security.xml 文件的 <embedded-database> 声明中添加对新 SQL 脚本的引用:

 

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

 

配置 remember me 服务持久化到数据库

          最后我们需要对 <remember-me> 声明做一些简单的配置修改使其指向我们使用的 data source

 

Xml代码  收藏代码
  1. < http   auto-config = "true"   use-expressions = "true"    
  2.       access-decision-manager-ref = "affirmativeBased" >   
  3.   < intercept-url   pattern = "/login.do"   access = "permitAll" />   
  4.   < intercept-url   pattern = "/account/*.do"     
  5.              access = "hasRole('ROLE_USER') and fullyAuthenticated" />   
  6.   < intercept-url   pattern = "/*"   access = "hasRole('ROLE_USER')" />   
  7.   < form-login   login-page = "/login.do"   />   
  8.   < remember-me   key = "jbcpPetStore"   token-validity-seconds = "3600"    
  9.                data-source-ref = "dataSource" />   
  10.   < logout   invalidate-session = "true"   logout-success-url = ""    
  11.           logout-url = "/logout" />   
  12. </ http >   

 这就是我们所有要做的。现在,如果你重启应用,将不会丢失之前合法用户设置的 remember me cookie

 

基于数据库后台的持久化 tokens 是不是更安全?

          你可能会回忆起我们在第三章实现的 TokenBasedRememberMeServices ,它用 MD5 哈希算法将一系列与用户相关的数据编码成安全的 cookie ,这种方式很难(但并非不可能)篡改。 o.s.s.web.authentication.rememberme.PersistentTokenBasedRememberMeServices 类实现了持久化 tokens 以及对 token 安全处理,它通过一个校验方法以稍微不同的方式处理潜在的篡改。

          PersistentTokenBasedRememberMeServices 为每个用户创建一个唯一的序列号, 用户在继续交互和认证时要使用序列号中唯一的 tokens 。序列号和 token 被存储在 cookie 中,在认证时要用来与存储的 token 进行对比。序列号和 token 都是基于配置的长度随机生成的,这使得恶意用户成功暴力破解的可能性很小了。

          TokenBasedRememberMeServices 类似,持久化的 token 也可能被 cookie 窃取或其它的 man-in-the-middle 技术。在使用持久化 token 时,依旧建议用自定义的子类将 IP 地址合并到持久化 token 中,以及对站点的敏感区域强制使用用户名和密码认证。

SSL 保护你的站点

          在日常使用在线站点时,你很可能已经听说或使用过 SSL 。安全套接字层( SSL )协议,以及其后续的传输层安全( TLS ),被用来为网络上的 HTTP 事务提供传输层的安全——它们被称为安全的 HTTP 事务( HTTPS )。

          简而言之, SSL TLS 以一种对用户透明的方式保护原始的 HTTP 传输数据,这些数据在客户端浏览器和 web 服务器之间传输。但是作为开发人员,在设计安全站点时,规划使用 SSL 是很重要的。 Spring Security 提供了一系列的配置选项可以灵活的将 SSL 集成到 web 应用中。

【尽管 SSL TLS 是不同的协议( TLS 是更成熟的协议),单数大多数人更熟悉 SSL 这个术语,所以在本书的剩余部分,我们使用这个术语来代指 SSL TLS 两个协议。】

详细介绍 SSL 协议的机制已经超出了本书的范围,有一些很好的书籍和技术论文很详细地介绍了其规范和协议(你可以从 RFC 5246 :传输安全协议( TLS Version1.2 开始,在以下地址 http://tools.ietf.org/html/rfc5246

配置 Apache Tomcat 以支持 SSL

          首先且最重要的是,如果你计划执行如下 SSL 相关的例子,需要配置应用服务器以支持 SSL 连接。对于 Apache Tomcat ,这相对很容易。如果你在使用其它的应用服务器,请查看文档的相关部分。

生成 server key store

          我们需要使用 Java keytool 命令来生成一个 key store 。打开一个命令提示窗口,并输入以下的命令:

 

Java代码  收藏代码
  1. keytool -genkeypair -alias jbcpserver -keyalg RSA -validity  365    
  2.   -keystore tomcat.keystore -storetype JKS  

 

 按照提示进行如下的输入。输入密码 password 作为 key store 和个人密钥的密码。

 

Java代码  收藏代码
  1. What is your first and last name?  
  2.   [Unknown]:  JBCP Pets Admin  
  3. What is the name of your organizational unit?  
  4.   [Unknown]:  JBCP Pets  
  5. What is the name of your organization?  
  6.   [Unknown]:  JBCP Pets  
  7. What is the name of your City or Locality?  
  8.   [Unknown]:  Anywhere  
  9. What is the name of your State or Province?  
  10.   [Unknown]:  NH  
  11. What is the two-letter country code for   this  unit?  
  12.   [Unknown]:  US  
  13. Is CN=JBCP Pets Admin, OU=JBCP Pets, O=JBCP Pets, L=Anywhere, ST=NH, C=US   
  14. correct?  
  15.   [no]:  yes  

 这将会在当前目录下,生成一个名为 tomcat.keystore 的文件。这就是启用 Tomcat SSL 所使用的 key store

 

【注意的是要执行的是 genkeypair 命令(在早于 java 6 的释放版本中要使用 keytool genkey 命令)】

          为了下一步的操作,需要记住这个文件的地址。

配置 Tomcat SSL Connector

          Apache Tomcat conf 目录下,用 XML 编辑器( Eclipse 或类似的都可以)打开 server.xml ,并取消注释或添加 SSL Connector 声明。应该如下所示:

 

Xml代码  收藏代码
  1. < Connector   port = "8443"   protocol = "HTTP/1.1"   SSLEnabled = "true"   
  2.   maxThreads = "150"   scheme = "https"   secure = "true"   
  3.   sslProtocol = "TLS"    
  4.   keystoreFile = "conf/tomcat.keystore"   
  5.   keystorePass = "password" />   

 确保在上一步中生成的 tomcat.keystore 文件被 copy 到了 Tomcat 安装路径的 conf 目录下。在配置后, Tomcat 服务器可以重启, JBCP   Pets 应用能够在一个安全的端口 https://localhost:8443/JBCPPets/ 上进行访问。

 

          取决于不同的浏览器,可能需要包含 https 而不是 http 。这样的问题可能会比较难发现,你可能会比较奇怪为什么不能看到 JBCP   Pets 的主页。

对站点进行自动的安全保护

          我们假设你在对客户的数据进行 SSL 保护时遇到了麻烦,你想把应用的特定部分置于 SSL 的保护之下。幸运的是, Spring Security 让这一切变得很简单,只需要在 <intercept-url> 声明上添加一个配置属性。

          requires-channel 属性能够添加到任何 <intercept-url> 声明中,以要求所有匹配的 URL 要以特定的协议( HTTP HTTPS 或都可以)进行传递。如果按照这种形式来增强 JBCP Pets 站点,配置可能如下所示:

 

Xml代码  收藏代码
  1. < http   auto-config = "true"   use-expressions = "true" >   
  2.   < intercept-url   pattern = "/login.do"   access = "permitAll"    
  3.                  requires-channel = "https" />   
  4.   < intercept-url   pattern = "/account/*.do"    
  5.                  access = "hasRole('ROLE_USER') and fullyAuthenticated"    
  6.                  requires-channel = "https" />   
  7.   < intercept-url   pattern = "/*"   access = "permitAll"    
  8.                  requires-channel = "any" />   
  9.   <!-- ... -->   
  10. </ http >     

 如果此时重启应用,你将会发现:

 

l   现在访问登录页和账号页需要 HTTPS ,浏览器将会为用户自动从不安全的( HTTP URL 重定向到安全的 URL 。例如,尝试访问 http://localhost:8080/JBCPPets/login.do 将会被定向到 https://localhost:8443/JBCPPets/login.do

l   如果用户被切换到了安全的 HTTPS URL ,如果他访问一个不必要使用 HTTPS URL ,他能继续保留在 HTTPS 状态。

 

我们可以想象这种配置对于安全的好处——大多数的现代应用服务器使用一个 secure 标识 session cookie ,所以强制要求登录页是安全的(如果这是应用的 session 被首次分配的地方)能够保证 session cookie 能够被安全的传输,所以出现 session 劫持的可能性也更小。另外,直接将 SSL 加密配置在安全声明上的做法,能够很容易的保证应用中所有敏感的页面被适当和完整的保护。

为用户自动切换适当协议( HTTP HTTPS )的功能,通过 Spring Security 过滤器链上的另外一个 servlet 过滤器来实现的(它的位置很靠前,在 SecurityContextPersistenceFilter 后面)。如果任何 URL requires-channel 属性声明使用特定类型的协议, o.s.s.web.access.channel.ChannelProcessingFilter 将会自动添加到过滤器链上

          ChannelProcessingFilter 在请求时的交互过程如下图所示:



 如果你的应用需要超出内置功能的复杂逻辑, ChannelProcessingFilter 的设计可以进行扩展和增强。注意我们尽管只在图中说明了 SecureChannelProcessor RetryWithHttpsEntryPoint 的实现,但是有类似的类去校验和处理声明为要求 HTTP URL

          注意, ChannelEntryPoint 使用了 HTTP 302 URL 重写,这就不能使用这种技术去重定向 POST URL (尽管典型的 POST 请求不应该在安全协议和不安全协议间传递,因为大多数的应用都会对这种行为提出警告)。

安全的端口映射

          在一些特定的环境中,可能不会使用标准的 HTTP HTTPS 端口,其默认为 80/443 8080/8443 。在这种情况下,你必须配置你的应用包含明确的端口映射,这样 ChannelEntryPoint 的实现能够确定当重定向用户到安全或不安全的 URL 时,使用什么端口。

          这仅需要增加额外的配置元素 <port-mappings> ,它能够指明除了默认的端口以外,额外的 HTTP  HTTPS 端口:

 

Xml代码  收藏代码
  1. < port-mappings >   
  2.   < port-mapping   http = "9080"   https = "9443" />   
  3. </ port-mappings >   

 如果你的应用服务器在反向代理后的话,端口映射将会更加的重要。

 

小结

          在本章中,我们:

l   介绍了把安全数据存储在支持 JDBC 的数据库中是如何配置的;

l   配置 JBCP Pets 使用数据库来进行用户认证以及高安全性的密码存储,这里我们使用了密码加密和 salting 技术;

l   管理 JDBC 持久化到数据中的用户;

l   配置用户到安全组中。组被授予角色,而不是直接对用户进行角色的指定。这提高了站点和用户功能的可管理性;

l   介绍了 Spring Security 使用遗留的(非默认的)数据库 schema

l   讲解了 HTTPS 技术的配置及应用,它能够提高数据在访问应用敏感内容时的安全性。

          在接下来的章节中,我们将会介绍 Spring Security 一些高级的授权功能,并引入 Spring Security JSP 标签以实现良好的授权。

 

分享到:
评论

相关推荐

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

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

    Spring Security3

    #### 第四章:凭证安全存储 **使用数据库后台的认证** - **配置**:通过配置`UserDetailsService`接口实现与数据库交互。 - **实现细节**:使用JDBC访问数据库,获取用户信息。 **安全的密码配置** - **密码编码**...

    spring-security书籍翻译

    源码解析可以帮助我们理解如何自定义认证提供者,以及如何与Spring Security的Remember Me服务集成,实现自动登录功能。 2. **权限控制**:基于角色的访问控制(RBAC)是Spring Security的核心部分。它允许开发人员...

    Spring Security3 中文版 张卫滨 推荐

    ### 第四章:凭证安全存储 本章讨论了如何安全地存储用户凭证,尤其是在数据库中存储凭证的安全实践。 - **使用数据库后台的Spring Security认证**:介绍了如何利用数据库作为认证后端。 - **配置位于数据库上的...

    spring security3中文文档

    #### 第四章:凭证安全存储 - **使用数据库后台的Spring Security认证**: - **配置位于数据库上的认证存储**:指导如何设置数据库认证。 - **基于数据库后台的认证是如何实现的**:解释数据库认证的工作流程。 ...

    spring security 学习总结文档

    - 在 `pom.xml` 添加必要的依赖,包括 `spring-security-core`、`spring-security-web`、`spring-security-config`、`spring-security-taglib` 和 `spring-security-crypto`。 - 创建 `security.xml` 配置文件,...

    Spring Security3.pdf

    总的来说,Spring Security是一个功能全面的安全框架,提供了认证、授权、攻击防护、安全请求处理、审计、自定义登录页、RememberMe、凭证安全存储、SSL保护、精确访问控制、方法安全以及高级配置和扩展等多项功能。...

    Spring Security3 张卫滨(译)

    ### Spring Security基础知识点 ...包含了安全审计、认证授权、自定义登录页、凭证存储、SSL配置等核心概念和实践方法,旨在帮助读者全面理解Spring Security在Java Web应用中的应用及其提供的安全机制。

    SpringSecurity 中文

    #### 第四章:凭证安全存储 **使用数据库后台的Spring Security认证** - **配置**:定义数据源、用户细节服务以及密码编码器。 - **实现**:通过继承`UserDetailsService`接口并实现`loadUserByUsername`方法加载...

    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与其他基于过滤器的...

    Spring_Security-3.0.1_中文自学教程.pdf

    Spring Security 起源于 Acegi 安全框架,随后被纳入 Spring 项目中,经过不断的发展和完善,已经成为 Spring 生态系统中不可或缺的一部分。随着版本的迭代,Spring Security 在功能上越来越强大,同时也更加注重...

    SpringSecurity 3.0.1.RELEASE.CHM

    4. Spring Security社区 4.1. 任务跟踪 4.2. 成为参与者 4.3. 更多信息 II. 结构和实现 5. 技术概述 5.1. 运行环境 5.2. 核心组件 5.2.1. SecurityContextHolder, SecurityContext 和 Authentication对象 ...

    spring权限管理

    此外,Spring Security还支持记住我(Remember Me)功能,允许用户在一段时间内无需重新登录。 **角色管理** 在Spring Security中,角色是权限的载体。用户可以被分配一个或多个角色,每个角色拥有特定的权限。角色...

    SpringSecurity

    SpringSecurity是Java开发领域中一个强大的安全框架,用于构建安全的Web应用程序。它提供了一整套解决方案,包括认证、授权、会话管理以及防止常见攻击等。本篇将深入探讨SpringSecurity的核心概念、主要功能以及...

    securitydemo.rar

    然而,SpringSecurity的功能远不止于此,它还支持CSRF防护、会话管理、RememberMe服务等多种高级特性,开发者可以根据实际需求进行深入学习和配置。理解并掌握这些知识点,将使你的Web应用在安全性上更上一层楼。

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.rar

    Acegi是Spring Security的前身,它是一个强大的、可...尽管Acegi已被Spring Security所取代,但其核心理念和使用方法在Spring Security中仍然得到延续,因此学习Acegi对于理解Spring Security的安全机制非常有帮助。

    shiro用户教程pdf

    ### 第十四章:SSL SSL(Secure Sockets Layer)是一种用于加密网络通信的安全协议。Shiro可以与SSL结合使用,以确保用户数据的安全传输。 ### 第十五章:单点登录 #### 15.1 服务器端 单点登录(Single Sign-On...

Global site tag (gtag.js) - Google Analytics