Spring Security(12)——Remember-Me功能
Remember-Me功能
目录
1.1 概述
1.2 基于简单加密token的方法
1.3 基于持久化token的方法
1.4 Remember-Me相关接口和实现类
1.4.1 TokenBasedRememberMeServices
1.4.2 PersistentTokenBasedRememberMeServices
1.1 概述
1.2 基于简单加密token的方法
当用户选择了记住我成功登录后,Spring Security将会生成一个cookie发送给客户端浏览器。cookie值由如下方式组成:
base64(username+":"+expirationTime+":"+md5Hex(username+":"+expirationTime+":"+password+":"+key))
Ø expirationTime:token失效的日期和时间,以毫秒表示。
使用这种方式时,我们只需要在http元素下定义一个remember-me元素,同时指定其key属性即可。key属性是用来标记存放token的cookie的,对应上文提到的生成token时的那个key。
<security:http auto-config="true">
<security:remember-me key="elim"/>
<security:intercept-url pattern="/**" access="ROLE_USER" />
<security:http auto-config="true">
<!-- 定义记住我功能,通过user-service-ref指定将要使用的UserDetailsService-->
<security:remember-me key="elim" user-service-ref="userDetailsService"/>
<security:intercept-url pattern="/**" access="ROLE_USER" />
<bean id="userDetailsService"class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource"/>
1.3 基于持久化token的方法
(1)用户选择了“记住我”成功登录后,将会把username、随机产生的序列号、生成的token存入一个数据库表中,同时将它们的组合生成一个cookie发送给客户端浏览器。
(4)如果对应cookie不存在,或者包含的username和序列号与数据库中保存的不一致,那么将会引导用户到登录页面。
使用持久化token方法时需要我们的数据库中拥有如下表及其表结构。
create table persistent_logins (username varchar(64) not null,
series varchar(64) primary key,
<security:http auto-config="true">
<security:remember-me data-source-ref="dataSource"/>
<security:intercept-url pattern="/**" access="ROLE_USER" />
1.4 Remember-Me相关接口和实现类
publicinterface RememberMeServices {
* 自动登录。在实现这个方法的时候应该判断用户提供的Remember-Me cookie是否有效,如果无效,应当直接忽略。
* 如果认证成功应当返回一个AuthenticationToken,推荐返回RememberMeAuthenticationToken;
Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);
* 在用户登录失败时调用。实现者应当做一些类似于删除cookie之类的处理。
void loginFail(HttpServletRequest request, HttpServletResponse response);
* 在用户成功登录后调用。实现者可以在这里判断用户是否选择了“Remember-Me”登录,然后做相应的处理。
void loginSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication successfulAuthentication);
1.4.1 TokenBasedRememberMeServices
如果把使用namespace定义Remember-Me改为直接定义RememberMeServices和对应的Filter来使用的话,那么我们可以如下定义。
<security:form-login login-page="/login.jsp"/>
<security:intercept-url pattern="/login*.jsp*"access="IS_AUTHENTICATED_ANONYMOUSLY"/>
<security:intercept-url pattern="/**" access="ROLE_USER" />
<!-- 把usernamePasswordAuthenticationFilter加入FilterChain -->
<security:custom-filter ref="usernamePasswordAuthenticationFilter"before="FORM_LOGIN_FILTER"/>
<security:custom-filter ref="rememberMeFilter" position="REMEMBER_ME_FILTER"/>
<!-- 用于认证的AuthenticationManager -->
<security:authentication-manager alias="authenticationManager">
<security:authentication-provider
user-service-ref="userDetailsService"/>
<security:authentication-provider ref="rememberMeAuthenticationProvider"/>
</security:authentication-manager>
class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
<property name="dataSource" ref="dataSource" />
<property name="rememberMeServices" ref="rememberMeServices"/>
<property name="authenticationManager" ref="authenticationManager"/>
<!-- 指定request中包含的用户名对应的参数名 -->
<property name="usernameParameter" value="username"/>
<property name="passwordParameter" value="password"/>
<property name="filterProcessesUrl" value="/login.do"/>
class="org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
<property name="rememberMeServices" ref="rememberMeServices" />
<property name="authenticationManager" ref="authenticationManager" />
<!-- RememberMeServices的实现 -->
class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="userDetailsService" />
<property name="key" value="elim" />
<!-- 指定request中包含的用户是否选择了记住我的参数名 -->
<property name="parameter" value="rememberMe"/>
<!-- key值需与对应的RememberMeServices保持一致 -->
<bean id="rememberMeAuthenticationProvider"
class="org.springframework.security.authentication.RememberMeAuthenticationProvider">
<property name="key" value="elim" />
1.4.2 PersistentTokenBasedRememberMeServices
<!-- RememberMeServices的实现 -->
<property name="userDetailsService" ref="userDetailsService" />
<property name="key" value="elim" />
<!-- 指定request中包含的用户是否选择了记住我的参数名 -->
<property name="parameter" value="rememberMe"/>
<!-- 指定PersistentTokenRepository -->
<property name="tokenRepository">
<beanclass="org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl">
<property name="dataSource" ref="dataSource"/>
<!-- 是否在系统启动时创建持久化token的数据库表 -->
<property name="createTableOnStartup" value="false"/>
(注:本文是基于Spring Security3.1.6所写)
(注:原创文章,转载请注明出处。原文地址:http://haohaoxuexi.iteye.com/blog/2163997)
Spring Security(12)——Remember-Me功能相关推荐
- 9.Spring Security添加记住我功能
在网站的登录页面中,记住我选项是一个很常见的功能,勾选记住我后在一段时间内,用户无需进行登录操作就可以访问系统资源.在Spring Security中添加记住我功能很简单,大致过程是:当用户勾选了记住 ...
- 【Spring Security】的RememberMe功能流程与源码详解
文章目录 前言 原理 基础版 搭建 初始化sql 依赖引入 配置类 验证 源码分析 进阶版 集成 源码分析 疑问1 疑问2 鉴权 升级版 集成 初始化sql 配置类 验证 源码分析 鉴权 流程 扩展版 ...
- Spring Security 3.1 中功能强大的加密工具 PasswordEncoder
去年发生的密码泄漏事件,我们也对密码加密做了重新研究. 在筛选加密方法的过程中,发现了Spring Security 3.1.0版本中提供了新的PasswordEncoder,它的加密方法非常给力! ...
- Spring Security记住我功能之潜在的账号盗取风险
Spring Security 前言 Spring Security过滤器链 账号风险 如何避免呢? 前言 记住我功能方便是大家看得见的,但是安全性却令人担忧.因为Cookie毕竟是保存在客户端的,很 ...
- Spring Security 入门 Remember-Me 记住我功能
用户选择了"记住我"成功登录后,将会把username.随机生成的序列号.生成的token存入一个数据库表中,同时将它们的组合生成一个cookie发送给客户端浏览器. 当没有登录的 ...
- oidc auth2.0_使用Spring Security 5.0和OIDC轻松构建身份验证
oidc auth2.0 "我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和 ...
- 使用Spring Security 5.0和OIDC轻松构建身份验证
"我喜欢编写身份验证和授权代码." 〜从来没有Java开发人员. 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证. Spri ...
- 看完阿里p8整理的Spring Security应用到源码手册,豁然开朗
又逢"金九银十",年轻的毕业生们满怀希望与忐忑,去寻找.竞争一个工作机会.已经在职的开发同学,也想通过社会招聘或者内推的时机争取到更好的待遇.更大的平台. 然而,面试人群众多,技术 ...
- Spring Security使用记录
文章目录 **前置知识** **1.概念介绍** **1.1权限管理** **1.2完成权限管理需要三个对象** **1.3Spring Security** **1.3.1创建web工程并导入jar ...
- SpringBoot 集成 Spring Security
Spring Security Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架.它实际上是保护基于spring的应用程序的标准. Spring Security是一个 ...
最新文章
- Windows自带的杀进程工具
- RxJava2 源码解析(一)
- [翻译]你或许还未听说过的一些ASP.NET 2.0要诀
- android 重装sdk或者系统的时模拟器出现can open ****
- Golang实践录:命令行cobra库实例优化
- 【luogu T34117 打油门】 题解
- SSM公司企业绩效考核管理系统
- Excel 图表与数据透视表制作
- cve-2018-1273复现思路及简单利用(避坑)
- 武魂java_js及jsp.java查错的几种方式
- Docker容器详细操作
- 苹果新专利针对骑自行车摔倒情况,苹果Find My使自行车免于丢失
- C++面向对象程序设计:地铁自动售票系统
- 深富策略军工股掀起涨停潮
- python股票数据分析_用Python抓取新浪的股票数据
- 女性英文名對照及涵意大全
- 法规标准-ISO 15622标准解读(2018版)
- 餐饮业数字化提速,OceanBase助海底捞变身“云上捞”
- 政务云系统——亿网软通“互联网+”政务云解决方案
- 谷歌地图拼接软件_谷歌地图上又有新发现?出现两个长条弧状物体,颜色一白和一黑...
热门文章
- 毒液蛋白质相互作用分析
- win7开机后svchost..exe占用CPU和内存很高的解决方法
- 如何使用burp绕过token
- 微信小程序——【云音乐播放器】
- 大数据技术之数据采集篇
- python BFS最短路径问题
- 【QTP专题】03_Add-in Manager插件
- MyISAM和InnoDB的区别
- 要想文章上Google搜索引擎首页,SEO 要做好下面7个点优化
- 错误解决:Problem binding to [0.0.0.0:10033] java.net.BindException