- 浏览: 447286 次
- 性别:
- 来自: 大连
博客专栏
-
《Spring Secur...
浏览量:379688
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《Spring Security3》一书的翻译说明 -
601235723:
bbjavaeye 写道你好,有个问题请教一下我配了<b ...
《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService) -
bay0902:
中国互联网的脊梁
Spring Security 3全文下载 -
hdcustc:
项目源码下载 微博网盘里的那个依赖文件损坏了啊 能否提供个可 ...
Spring Security 3全文下载 -
i641878506:
楼主辛苦, 可以提供原书的原项目文件的下载么
Spring Security 3全文下载
Remember me是否安全?
对我们精心保护的站点来说,为了用户体验而添加的任何与安全相关的功能,都有增加安全风险的潜在可能。按照其默认方式,Remember me功能存在用户的cookie被拦截并被恶意用户重用的风险。下图展现了这种情况是如何发生的:
使用SSL(第四章进行讨论)以及其他的网络安全技术能缓解这种类型攻击的风险,但是要注意的是还有其他技术如跨站脚本攻击(XSS)能够窃取或损害一个remembered user session。为了照顾用户的易用性,我们不会愿意让用户的财产信息或个人信息因为remembered session的不合理使用而遭到篡改或窃取。
【尽管我们不会涉及恶意用户行为的细节,但是当你实现安全系统时,了解恶意用户所使用的攻击技术是很重要的。XSS是其中的一种技术,当然还有其他的很多种。强烈建议你了解OWASP Top Ten(http://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project)作为一个入门列表并参考一本web应用安全参考书,里面介绍了各种的技术使用。】
平衡用户易用性和应用安全性的一种通用方法是识别出站点中与个人或敏感信息相关的功能点。确保这些功能点在进行授权校验时不仅要判断用户的角色,还要保证用户进行了完整的用户名和密码认证。这可以通过使用SpEL表达式语言的fullyAuthenticated伪属性来实现,关于授权规则的SpEL表达式语言我们在第二章中已经有所介绍。
Remember me认证与完整认证的在认证规则上的区别
我们将在随后的第五章:精确的访问控制中介绍高级的认证技术,但是,了解能够辨别认证session是否为remembered并以此建立访问规则也是很重要的。
我们可以设想一个使用remembered session登录的用户要查看和修改他的“wish list”。这与其他的客户在线站点很类似,并不会出现与用户信息或财务信息相关的风险(要注意的是每个站点各不相同,不能盲目的将这些规则应用与你的站点)。相反的,我们将会重点保护用户的账号以及订单功能。我们要确保即使是remembered的用户,如果试图访问账号信息或定购产品,都需要对他们进行认证。以下为我们如何设置授权规则:
<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')"/>
已经存在的登录页和ROLE_USER设置没有变化。但我们添加了一条规则,要求用户具有GrantedAuthority的ROLE_USER角色同时还要求用户被完全的认证,即这个认证的session确实是通过提供用户名、密码或等同的凭证来进行认证的。注意这里的SpEL逻辑操作语法——在SpEL中,使用and,or以及not作为逻辑操作符。这是SpEL的设计者充分考虑的结果,因为&&操作符在XML中很难被使用。
如果你在应用中尝试运行,如果以remember me功能登录并试图访问“My Account”链接,你将会得到一个403访问拒绝的提示,这说明这个地址已经被适当地保护了。出现错误界面是因为我们应用的配置还是使用默认的AccessDeniedHandler,这个类负责捕获和响应AccessDeniedException的信息。我们将会在第六章学习AccessDeniedException怎样被处理时,自定义这个行为。
【不使用表达式来实现完全认证的检查。如果你的应用不使用SpEL表达式来进行访问控制声明,你可以通过使用IS_AUTHENTICATED_FULLY访问规则来检查用户是不是进行了完整的认证(如:access=" IS_AUTHENTICATED_FULLY")。但要注意的是,这种标准的角色设置声明并没有SpEL那样强的表现力,所以如果要处理复杂的boolean表达式的时候,可能会比较困难。】
错误处理尚没有添加,但是你可以看到通过这种方式将remember me的易用性与更高层次的安全性结合了起来,用户访问敏感的信息时就会被要求提供完整的凭证信息。
构建一个关联IP的Remember me Service
有一种让remember me功能更安全的方式就是将用户的IP地址绑定到cookie的内容上。让我们通过一个例子来描述怎样构建RememberMeServices的实现类来完成这个功能。
基本的实现方式是扩展o.s.s.web.authentication.rememberme.TokenBasedRememberMeServices基类,以添加请求者的IP地址到cookie本身和其他的MD5哈希元素中。
扩展这个基类涉及到重写两个主要方法,并重写或实现几个小的帮助方法。还有一个要注意的是我们需要临时存储HttpServletRequest(将使用它来得到用户的IP地址)到一个ThreadLocal中,因为基类中的一些方法并没有将HttpServletRequest作为一个参数。
扩展TokenBasedRememberMeServices
首先,我们要扩展TokenBasedRememberMeServices类并重写父类的特定行为。尽管父类是非常易于重写,但是我们不想去重复一些重要的处理流程,所以能使这个类非常简明却有点不好理解。在com.packtpub.springsecurity.security包下创建这个类:
public class IPTokenBasedRememberMeServices extends TokenBasedRememberMeServices {
还有一些简单的方法来设置和获取ThreadLocal HttpServletRequest:
private static final ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<HttpServletRequest>(); public HttpServletRequest getContext() { return requestHolder.get(); } public void setContext(HttpServletRequest context) { requestHolder.set(context); }
我们还需要添加一个工具方法以从HttpServletRequest中获取IP地址:
protected String getUserIPAddress(HttpServletRequest request) { return request.getRemoteAddr(); }
我们要重写的第一个有趣的方法是onLoginSuccess,它用来为remember me处理设置cookie的值。在这个方法中,我们需要设置ThreadLocal并在完成处理后将其清除。需要记住的是父类方法的处理流程——收集用户的所有认证请求信息并将其合成到cookie中。
@Override public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) { try { setContext(request); super.onLoginSuccess(request, response, successfulAuthentication } finally { setContext(null); } }
父类的onLoginSuccess方法将会触发makeTokenSignature方法来创建认证凭证的MD5哈希值。我们将要重写此方法,以实现从request中获取IP地址并使用Spring框架的一个工具类编码要返回的cookie值。(这个方法在进行remember me校验时还会被调用到,以判断前台传递过来的cookie值与后台根据用户名、密码、IP地址等信息生成的MD5值是否一致。——译者注)
@Override protected String makeTokenSignature(long tokenExpiryTime, String username, String password) { return DigestUtils.md5DigestAsHex((username + ":" + tokenExpiryTime + ":" + password + ":" + getKey() + ":" + getUserIPAdd ress(getContext())).getBytes()); }
与之类似的,我们还重写了setCookie方法以添加包含IP地址的附加编码信息:
@Override protected void setCookie(String[] tokens, int maxAge, HttpServletRequest request, HttpServletResponse response) { // append the IP adddress to the cookie String[] tokensWithIPAddress = Arrays.copyOf(tokens, tokens.length+1); tokensWithIPAddress[tokensWithIPAddress.length-1] = getUserIPAddress(request); super.setCookie(tokensWithIPAddress, maxAge, request, response); }
这就得到了生成新cookie所有需要的信息。
最后,我们要重写processAutoLoginCookie方法,它用来校验用户端提供的remember me cookie的内容。父类已经为我们解决了大部分有意思的工作,但是,为了避免调用父类冗长的代码,我们在调用它之前先进行了一次IP地址的校验。
@Override protected UserDetails processAutoLoginCookie( String[] cookieTokens, HttpServletRequest request, HttpServletResponse response) { try { setContext(request); // take off the last token String ipAddressToken = cookieTokens[cookieTokens.length-1]; if(!getUserIPAddress(request).equals(ipAddressToken)) { throw new InvalidCookieException("Cookie IP Address did not contain a matching IP (contained '" + ipAddressToken + "')"); } return super.processAutoLoginCookie(Arrays.copyOf(cookieTokens, cookieTokens.length-1), request, response); } finally { setContext(null); } }
我们的自定义的RememberMeServices编码已经完成了。现在我们要进行一些微小的配置。这个类的完整源代码(包括附加的注释)都在本章的源码中能够找到。
配置自定义的RememberMeServices
配置自定义的RememberMeServices实现需要两步来完成。第一步是修改dogstore-base.xml Spring配置文件,以添加我们刚刚完成类的Spring Bean声明:
<bean class="com.packtpub.springsecurity.security.IPTokenBasedRememberMeServices" id="ipTokenBasedRememberMeServicesBean"> <property name="key"><value>jbcpPetStore</value></property> <property name="userDetailsService" ref="userService"/> </bean>
第二个要进行的修改是Spring Security的XML配置文件。修改<remember-me>元素来引用自定义的Spring Bean,如下所示:
<remember-me key="jbcpPetStore" services-ref="ipTokenBasedRememberMeServicesBean"/>
最后为<user-service>声明添加一个id属性,如果它还没有添加的话:
<user-service id="userService">
重启web应用,你将能看到新的IP过滤功能已经生效了。
因为remember me cookie是Base64编码的,我们能够使用一个Base64解码的工具得到cookie的值以证实我们的新增功能是否生效。如果我们这样做的话,我们能够看到一个名为SPRING_SECURITY_REMEMBER_ME_COOKIE的cookie的内容大致如下所示:
guest:1251695034322:776f8ad44034f77d13218a5c431b7b34:127.0.0.1 |
正如我们所料,你能够看到IP地址确实存在于cookie的结尾处。在IP地址之前,你还能够分别看到用户名、时间戳以及MD5的哈希值。
【调试remember me cookie。在尝试调试remember me功能时,会有两个难点。第一个就是得到cookie的值本身!Spring Security并没有提供记录我们设置的cookie值的日志级别。我们推荐使用基于浏览器的工具如Mozilla Firefox下的Chris Pederick's Web Developer插件(http://chrispederick.com/work/web-developer/)。基于浏览器的开发工具一般允许查看(甚至编辑)cookie的值。第二个困难(相对来说较小)就是解码cookie的值。你能使用在线或离线的Base64解码工具来对cookie的值进行解码(需要记住的是添加一个等号符(=)结尾,以使其成为一个合法的Base64编码值)。】
如果用户是在一个共享的或负载均衡的网络设施下,如multi-WAN公司环境,基于IP的remember me tokens可能会出现问题。但是在大多数场景下,添加IP地址到remember me功能能够为用户提供功能更强、更好的安全层。
自定义Remember me的签名
好奇的读者可能会关心remember me form的checkbox名(_spring_security_remember_me)以及cookie的名(SPRING_SECURITY_REMEMBER_ME_COOKIE),是否能够修改。<remember-me>声明是不支持这种扩展性的,但是现在我们作为一个Spring Bean声明了自己的RememberMeServices实现,那我们能够定义更多的属性来改变checkbox和cookie的名字:
<bean class="com.packtpub.springsecurity.web.custom. IPTokenBasedRememberMeServices" id="ipTokenBasedRememberMeServicesBean"> <property name="key"><value>jbcpPetStore</value></property> <property name="userDetailsService" ref="userService"/> <property name="parameter" value="_remember_me"/> <property name="cookieName" value="REMEMBER_ME"/> </bean>
不要忘记的是,还需要修改login.jsp页面中的checkbox form域以与我们声明的parameter值相匹配。我们建议你进行一下实验以确保理解这些设置之间的关联。
(如果想更好的理解本章节内容,建议阅读一下Spring Security的源码——译者注)
评论
发表评论
-
Spring Security 3全文下载
2012-03-15 20:31 20119本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6417附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5192第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 7803第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4766在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6122第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8575高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12230第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6383明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7086LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6107第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2878属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5327OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7503第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2653典型ACL部署所要考虑的事情 ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(下)
2012-01-17 22:17 4143支持ACL的Spring表达式语言 SpEL对A ... -
《Spring Security3》第七章第二部分翻译(高级ACL)(上)
2012-01-10 22:59 4569高级ACL话题 一些高级的话 ... -
《Spring Security3》第七章第一部分翻译(访问控制列表ACL)
2011-12-30 22:02 9444第七章 访问控制列表(ACL) 在本章中, ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-11-22 22:37 5374认证事件处理 有一个重要的功能只能通 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-11-22 22:25 5387Spring Security基于bean的高级配置 ...
相关推荐
NULL 博文链接:https://lengyun3566.iteye.com/blog/1141347
spring security3 中文版本
Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf Spring Security 3.pdf
该资源是基本Spring Security实战七篇文档中组织的源码,详情...ssecurity-rememberMe项目是Spring Security实战(七)的源码; 本人开发工具是IDEA,每个项目中的代码均可以运行并测试。Eclipse也是一样可以运行的。
Spring Security3 拦截 过滤器 安全,框架原理入门
第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用中心认证服务 第十一章:客户端...
3、Spring Security 2.x Overview 4、Dive Into Spring Security Authentication Authorization 5、Development Experiences & Demo 6、Q & A 张明星 5年以上保险、电信大中型项目开发经验,对JavaEE有较深入理解...
spring security spring security 中文文档
简单的 springSecurity3例子代码
Spring Security三份资料,实战Spring Security 3.x.pdf;Spring Security 3.pdf;Spring Security使用手册.pdf
Spring Security:spring家族一员。是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在Spring应用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反转...
Spring Security3 Demo ,根据Spring Security 安全权限管理手册 整理出的例子。 通过eclipse部署。
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 security中,由security3来管理用户的权限设置。目前项目由spring security2升级到spring security3。...
spring security3 安全框架
Spring Security 安全管理
Spring Security3
springsecurity3x快速构建企业级安全 Spring Security-3.0.1中文官方文档
Spring Security in Action
Spring Security 3 By Peter Mularien和翻译 Publisher: Packt Publishing 2010 | 420 Pages | ISBN: 1847199747 | PDF | 5 MB