- 浏览: 298187 次
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下showPassst ...
我写的密码强度验证方法(原创) -
kingcs2008:
// 验证pws.jsshowPassstrength(&qu ...
我写的密码强度验证方法(原创) -
h957355152:
请问博主这个怎么用呢?我直接放到jsp里面调用showPass ...
我写的密码强度验证方法(原创) -
qq_15138059:
我写的全国省市县三级联动菜单,拿出来和大家分享了(原创) -
valenon:
评论呢?从MAIL FROM命令开始貌似就出错了:500 Er ...
如何发送伪造的电子邮件
将 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 :
- create table persistent_logins (
- username varchar_ignorecase(50) not null ,
- series varchar (64) primary key ,
- token varchar (64) not null ,
- last_used timestamp not null );
为嵌入式数据库声明添加新的 SQL 脚本
接下来,在 dogstore-security.xml 文件的 <embedded-database> 声明中添加对新 SQL 脚本的引用:
- <jdbc:embedded- database id= "dataSource" type= "HSQL" >
- <jdbc:script location="classpath:security-schema.sql" />
- <jdbc:script location="classpath:remember-me-schema.sql" />
- <jdbc:script location="classpath:test-users-groups-data.sql" />
- </jdbc:embedded-database >
配置 remember me 服务持久化到数据库
最后我们需要对 <remember-me> 声明做一些简单的配置修改使其指向我们使用的 data source :
- < http auto-config = "true" use-expressions = "true"
- access-decision-manager-ref = "affirmativeBased" >
- < intercept-url pattern = "/login.do" access = "permitAll" />
- < intercept-url pattern = "/account/*.do"
- access = "hasRole('ROLE_USER') and fullyAuthenticated" />
- < intercept-url pattern = "/*" access = "hasRole('ROLE_USER')" />
- < form-login login-page = "/login.do" />
- < remember-me key = "jbcpPetStore" token-validity-seconds = "3600"
- data-source-ref = "dataSource" />
- < logout invalidate-session = "true" logout-success-url = ""
- logout-url = "/logout" />
- </ 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 。打开一个命令提示窗口,并输入以下的命令:
- keytool -genkeypair -alias jbcpserver -keyalg RSA -validity 365
- -keystore tomcat.keystore -storetype JKS
按照提示进行如下的输入。输入密码 password 作为 key store 和个人密钥的密码。
- What is your first and last name?
- [Unknown]: JBCP Pets Admin
- What is the name of your organizational unit?
- [Unknown]: JBCP Pets
- What is the name of your organization?
- [Unknown]: JBCP Pets
- What is the name of your City or Locality?
- [Unknown]: Anywhere
- What is the name of your State or Province?
- [Unknown]: NH
- What is the two-letter country code for this unit?
- [Unknown]: US
- Is CN=JBCP Pets Admin, OU=JBCP Pets, O=JBCP Pets, L=Anywhere, ST=NH, C=US
- correct?
- [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 声明。应该如下所示:
- < Connector port = "8443" protocol = "HTTP/1.1" SSLEnabled = "true"
- maxThreads = "150" scheme = "https" secure = "true"
- sslProtocol = "TLS"
- keystoreFile = "conf/tomcat.keystore"
- 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 站点,配置可能如下所示:
- < http auto-config = "true" use-expressions = "true" >
- < intercept-url pattern = "/login.do" access = "permitAll"
- requires-channel = "https" />
- < intercept-url pattern = "/account/*.do"
- access = "hasRole('ROLE_USER') and fullyAuthenticated"
- requires-channel = "https" />
- < intercept-url pattern = "/*" access = "permitAll"
- requires-channel = "any" />
- <!-- ... -->
- </ 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 端口:
如果你的应用服务器在反向代理后的话,端口映射将会更加的重要。
小结
在本章中,我们:
l 介绍了把安全数据存储在支持 JDBC 的数据库中是如何配置的;
l 配置 JBCP Pets 使用数据库来进行用户认证以及高安全性的密码存储,这里我们使用了密码加密和 salting 技术;
l 管理 JDBC 持久化到数据中的用户;
l 配置用户到安全组中。组被授予角色,而不是直接对用户进行角色的指定。这提高了站点和用户功能的可管理性;
l 介绍了 Spring Security 使用遗留的(非默认的)数据库 schema ;
l 讲解了 HTTPS 技术的配置及应用,它能够提高数据在访问应用敏感内容时的安全性。
在接下来的章节中,我们将会介绍 Spring Security 一些高级的授权功能,并引入 Spring Security 的 JSP 标签以实现良好的授权。
发表评论
-
spring-security3 配置和使用(二)承上
2011-12-22 06:42 9582、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 856最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2609作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1003一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3372不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1681笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1230认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1007Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 957手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第四部分翻译(异常处理)(转载)
2011-12-23 06:34 1151理解和配置异常处理 ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4188Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1421实现自定义的 AuthenticationProvide ... -
《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)
2011-12-24 10:21 1046第六章 高级配置和扩展 到目前为止,我 ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 983方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 839保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 986使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 883实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 910第五章 精确的 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1729你是否愿意在密码上添加点salt ? 如果安 ... -
《Spring Security3》第四章第三部分翻译上(配置安全的密码)(转载)
2011-12-26 00:41 953配置安全的密码 我们 ...
相关推荐
NULL 博文链接:https://lengyun3566.iteye.com/blog/1141347
spring security3 中文版本
该资源是基本Spring Security实战七篇文档中组织的源码,详情...ssecurity-rememberMe项目是Spring Security实战(七)的源码; 本人开发工具是IDEA,每个项目中的代码均可以运行并测试。Eclipse也是一样可以运行的。
Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf
第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用中心认证服务 第十一章:客户端证书认证 第十二章:...
Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf
spring security spring security 中文文档
我基于参考网上一个案例,通过spring security3源代码的修改,使该项目完成了了前台+后台的登录方式。而且可以还可以继续扩展多用户登陆。 (4)项目除了security3的配置使用XML以外,其他基本使用注解配置完成 (5...
简单的 springSecurity3例子代码
Spring Security 3 By Peter Mularien和翻译 Publisher: Packt Publishing 2010 | 420 Pages | ISBN: 1847199747 | PDF | 5 MB
3、Spring Security 2.x Overview 4、Dive Into Spring Security Authentication Authorization 5、Development Experiences & Demo 6、Q & A 张明星 5年以上保险、电信大中型项目开发经验,对JavaEE有较深入理解...
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 Security 安全权限管理手册 整理出的例子。 通过eclipse部署。
Spring Security in Action
spring security2.5 jar 和spring security2.5 整合必须的jar包
项目应用到spring3,security3,hibernate4,struts2;应用中涉及到安全认证,目前项目有独立的统一认证网关,所以登录时只需要将安全认证网关的认证后信息塞到spring security中,由security3来管理用户的权限设置。...
Spring Security3
Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...
springsecurity是一个功能强大且高度可定制的身份验证和访问控制框架。springsecurity是一个专注于为Java应用程序提供身份验证和授权的框架。与所有Spring项目一样,Spring安全性的真正威力在于它可以很容易地扩展以...
三更springsecurity学习笔记