实施Remember-Me认证
原文:
http://tech.it168.com/j/2007-11-05/200711051740968_2.shtml
一、Remember-Me认证功能介绍
很多网站的用户登录页面都提供了一个类似于“两周内不用再登录”、“记住我的帐号”等功能,其原理是在用户登录成功后使用客户端浏览器的Cookie记录用户登录信息,当下次再访问相同站点时,直接从Cookie中取得用户登录信息并进行自动登录。这即是经典的Remember-Me的功能,该功能在一定程度上降低了用户频繁登录的麻烦。根据系统安全性需求的不同,Remember-Me可能在Cookie中保存用户名/密码或仅保存用户名,前者可以完成自动登录,而后者只是让用户避免输入用户名。
如果在Cookie中记录用户名/密码,虽然可以避免每次访问网站都进行登录的麻烦,但这把双刃剑的反面是黑客可以在一定条件下获取这个免检的通行证。为了在给用户带来便利的同时尽力降低潜在的风险,Cookie保存用户名/密码的方式变得非常关键,以下几点是必须考虑的问题:
1) Cookie是易受攻击的,多用户共享浏览器和跨站点脚本攻击都可能使Cookie失窃;
2)将用户名/密码保存在Cookie中,意味着用户可以在不显式进行登录的情况下,获取正常登录的一切权限;
3)一切可以从Cookie中反推出密码明文的存储方式都是不可接受的;
4)必须将客户端IP信息绑定在Cookie中,这样即使Cookie失窃,也不可能在其它机器使用。
如果说HttpSessionContextIntegrationFilter通过HttpSession使Authentication获得跨请求共享的能力,那么Remember-Me则通过Cookie使Authentication获得跨多个Session的能力。Remember-Me功能可以视为一套解决方案,以下是Remember-Me中最关键的三个问题:
1) 在用户登录时,获取用户名/密码的信息,并将其以一定方式保存到Cookie中;
2) 在Cookie有效时间内,当用户访问站点安全页面时,自动进行登录;
3) 必须提供一个功能,让用户可以手工清除Remember-Me Cookie。
org.acegisecurity.ui.rememberme.RememberMeServices是Remember-Me方案中最关键的一个接口,它定义了以下几个方法:
l void loginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication):登录成功后调用该方法,将用户名/密码保存到Cookie中;
l void loginFail(HttpServletRequest request, HttpServletResponse response):登录失败后调用该方法;
l Authentication autoLogin(HttpServletRequest request, HttpServletResponse response):从Cookie中自动获取用户名/密码进行自动登录。
loginSuccess()和loginFail()方法的调用已经编制到Acegi的AbstractProcessingFilter抽象过滤器中,这意味着任何注入了RememberMeServices实例的过滤器都会以适合的方式调用这两个方法。而autoLogin()方法则通过RememberMeProcessingFilter进行调用,当RememberMeProcessingFilter发现SecurityContextHolder中不存在有效的Authentication时,autoLogin()方法就会被执行。
Acegi为RememberMeServices接口提供了两个实现类,它们分别是:
l NullRememberMeServices:类似于适配器的实现类,它不做任何有意义的事情,这是AbstractProcessingFilter中默认的实现类;
l TokenBasedRememberMeServices:基于凭证(一般指用户名/密码)的Remember-Me实现类,它真实地实现了接口中的方法。
二、Remember-Me认证的代码实现
在登录时将用户名/密码记录到Cookie中
我们第一个要做的工作是通过调整AuthenticationProcessingFilter的配置,在处理用户登录页面提交的用户认证信息时,将用户名/密码通过Response记录到客户端的Cookie中:
代码清单 12 applicationContext-acegi-security.xml
记录Remember-Me的Cookie信息
…
<bean id="authenticationProcessingFilter"
class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
…
①注入一个RememberMeServices
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>
<bean id="rememberMeServices" ②RememberMeServices配置
class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="tokenValiditySeconds" value="432000"/> ②-1Cookie有效时间,单位为秒
<property name="key" value="baobaotao"/> ②-2 Cookie中的键值
</bean>
…
三、Remember-Me认证的代码分析
(1)
通过以上的配置,我们在处理用户登录的同时将用户名/密码的信息记录到Cookie中。authenticationProcessingFilter在完成用户身份认证后,如果认证成功,调用rememberMeServices的loginSuccess()方法,该方法将用户名/密码按以下方式进行编码,编码后再写到客户端的Cookie中:
base64(username + ":" + expirationTime + ":" + md5Hex(username + ":" + expirationTime + ":"+password + ":" + key))
base64()表示进行BASE64编码操作,而md5Hex()表示进行MD5摘要并将结果值以HEX(十六进制)进行编码。注意计算式中粗体所示key操作项,Acegi通过key防止整个加密串被恶意篡改。因为key是在服务端中指定的值,黑客无法进行猜测,在服务端通过如②-2所示的key属性指定该值。
(2)
Cookie的有效时间通过tokenValiditySeconds指定,默认为两个星期。②-1处我们显式指定为5天(对应的秒数)。
(3)
我们知道authenticationProcessingFilter处理对应/j_acegi_security_check的请求,我们应该让用户决定是否使用Remember-Me的功能,这可以通过一个名为“_acegi_security_remember_me”的HTTP参数来决定,当登录请求表单包含该参数时(勾选上对应的复选框),服务端认为需要启用Remember-Me功能,否则不启用Remember-Me功能。所以,我们必须相应地调整登录页面表单。
四、index.jsp:添加是否使用Remember-Me功能的控制参数
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
…
<form name="form1" method="post" action="<c:url value="/j_acegi_security_check"/>">
用户名:<input type="text" name="j_username"/><br/>
密 码:<input type="password" name="j_password"/><br/>
①用户可以通过勾选或取消该复选框决定是否启用Remember-Me功能
<input type="checkbox" name="_acegi_security_remember_me">5天内不用再登录
<input type="submit" value="登录"/>
</form>
…
分享到:
相关推荐
通过Vaadin实施“记住我” 登录... 您可以在阅读完整的教程下载,编译和运行示例git clone https://github.com/alejandro-du/remember-me-feature.gitcd remember-me-featuremvn clean package jetty:run将浏览器指向
$ npm install passport-remember-me 用法 配置策略 “记住我”身份验证策略使用存储在“记住我” cookie中的令牌对用户进行身份验证。 该策略需要verify回调,该回调使用令牌并done向用户提供的调用。 该策略还...
Atom-atom-remember-session.zip,A simple package to make Atom remember your previous session - Not being developed anymore!这个包不再被开发,因为Atom编辑器本身现在具有相同的功能,并且这个插件是为Atom的...
基于用户,角色,权限的spring_security完整项目 博文链接:https://abc08010051.iteye.com/blog/1995648
"remember-me": "git+ssh://git@github.com:holidayextras/remember-me.git#1.0.0" } } 用法 放 var rememberMe = require('rememberMe'); rememberMe.set( ); // sets default data (url) rememberMe.set( { foo:...
Laravel开发-laravel-remember-uploads Laravel中间件和助手,用于在表单验证期间记住上载的文件。
九年级英语Unit14-I-remember-meeting-all-of-you-in-Grade7-教(学)案.doc
前端开源库-remember-bower记住Bower,当升级项目中的依赖关系时,它包括
Ajax-remember-everything.zip,________、_、____。___。,ajax代表异步javascript和xml。它是多种web技术的集合,包括html、css、json、xml和javascript。它用于创建动态网页,其中网页的小部分在不重新加载网页的...
composer require barchart/laravel-remember-all 迁移新的remember_tokens表: php artisan migrate 更新您的身份验证保护: 'guards' => [ 'web' => [ 'driver' => 'rememberall' , 'provider' => 'users'...
记住光标位置这个插件可以记住光标的位置并滚动每个音符。 当您在笔记之间切换,从一个链接转到另一个链接,返回时,这非常方便,您无需滚动到上次的位置。 所有便笺的光标位置,滚动和文本选择都存储在文件中(可以...
1.下载jsencrypt 加密解密插件 ...Cookies.set('rememberMe', this.loginForm.rememberMe, { expires: 30 }); } else { Cookies.remove("username"); Cookies.remove("password"); Cookies.remove('rememberMe'); }
文章介绍:演示版安装npm i remember-scroll --save CDN < script src =" https://cdn.jsdelivr.net/npm/remember-scroll@latest/dist/remember-scroll.min.js " > </ script > 您可以在上获取最新版本...
如果使用自定义主题修改登录模板请注意/app/design/frontend/base/default/template/rememberme/目录。 该目录中的模板会覆盖基本登录表单,因此需要在那里复制自定义更改。 此扩展通过延长 cookie 的生命周期来...
进阶-使用Spring Security3.2搭建LDAP认证授权和Remember-me
摘要认证的密码加密通用密码加密Remember-Me(记住我)认证:基于散列的令牌方法Remember-Me(记住我)认证:基于持久化的令牌方法OAuth 2.
##App 部分: 该应用程序分为 3 个主要部分: 人物纪念,有人物信息和署名。 来自朋友和同事的同情广告。 和丧葬组织。 信息。 一组文章。 根据本节中的计划,应该汇总有关不同宗教、文化和任何其他可能出现的问题...
Oleose是免费的Bootstrap Bootstrap 3模板,具有引人注目的完全响应式设计,适用于任何应用程序专业着陆页。 模板带有开发人员友好且易于自定义的代码。 它可在所有主要的Web浏览器“ IE8 +”,平板电脑和手机上使用...
SHIRO-721 RememberMe填充Oracle漏洞RCE 0x00简介: cookie的cookiememeMe已通过AES-128-CBC模式加密,这很容易受到填充oracle攻击的影响。 攻击者可以使用有效的RememberMe cookie作为填充Oracle Attack的前缀,...
记住我不是谷歌Chrome 扩展程序可在 account.google.com 上禁用“记住我”功能