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

《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文件

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

    spring security3 中文版本

    spring security3 中文版本

    Spring Security实战源码

    该资源是基本Spring Security实战七篇文档中组织的源码,详情...ssecurity-rememberMe项目是Spring Security实战(七)的源码; 本人开发工具是IDEA,每个项目中的代码均可以运行并测试。Eclipse也是一样可以运行的。

    Spring Security 3.pdf

    Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf

    springSecurity3中文文档

    第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用中心认证服务 第十一章:客户端证书认证 第十二章:...

    Spring Security 资料合集

    Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf

    spring security spring security

    spring security spring security 中文文档

    spring3+struts2+hibernate3+spring security3 权限管理

    我基于参考网上一个案例,通过spring security3源代码的修改,使该项目完成了了前台+后台的登录方式。而且可以还可以继续扩展多用户登陆。 (4)项目除了security3的配置使用XML以外,其他基本使用注解配置完成 (5...

    springSecurity3例子

    简单的 springSecurity3例子代码

    Spring Security 3 By Peter Mularien电子书和翻译

    Spring Security 3 By Peter Mularien和翻译 Publisher: Packt Publishing 2010 | 420 Pages | ISBN: 1847199747 | PDF | 5 MB

    精彩:Spring Security 演讲PPT

    3、Spring Security 2.x Overview 4、Dive Into Spring Security Authentication Authorization 5、Development Experiences & Demo 6、Q & A 张明星 5年以上保险、电信大中型项目开发经验,对JavaEE有较深入理解...

    spring security3动态权限

    struts2 + spring3 + hibernate3 + spring security3 + mysql + tomcat sys_users;sys_roles;sys_authorities;sys_resources;sys_users_roles;sys_roles_authorities;sys_authorities_resources; PS:此项目运行不...

    Spring Security3 Demo

    Spring Security3 Demo ,根据Spring Security 安全权限管理手册 整理出的例子。 通过eclipse部署。

    Spring Security in Action

    Spring Security in Action

    spring spring security2.5 jar

    spring security2.5 jar 和spring security2.5 整合必须的jar包

    spring security 3 登录 退出 认证 最少配置

    项目应用到spring3,security3,hibernate4,struts2;应用中涉及到安全认证,目前项目有独立的统一认证网关,所以登录时只需要将安全认证网关的认证后信息塞到spring security中,由security3来管理用户的权限设置。...

    Spring Security3

    Spring Security3

    SpringSecurity.zip

    ​ Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...

    SpringSecurity项目

    springsecurity是一个功能强大且高度可定制的身份验证和访问控制框架。springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以...

    springsecurity学习笔记

    三更springsecurity学习笔记

Global site tag (gtag.js) - Google Analytics