博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Seucrity 之 Remember Me
阅读量:6313 次
发布时间:2019-06-22

本文共 2266 字,大约阅读时间需要 7 分钟。

hot3.png

Spring Security 提供了Remember-me机制用来实现记录用户的登录状态。方便用户下

次自动登录。Spring Security 对此操作提供了必要的钩子,remember-me有两个固定的实现

一个是使用把用户登录信息加密以cookie的方式保存到客户端。一是用户可以把用户信息

持久化到服务端的数据库中。

   注意:这两种实现都必须有一个 UserDetailsService实现。如果你使用一个没有使用

UserDetailsService的验证提供者,Remember-me将不会工作,除非你在应用的上下文中

有一个UserDetailsService对象。

一、基本的Hash保存到客户端的Cookie中。

     直接在命名空间<http>中加入<remember-me />元素,就可以使用本方法。但要注意的

是在你的。此时系统会自动为你生成UserDetailsService对象(如果你在配置文件中定义了此

对象必须在<remember-me />使用user-service-ref指定)。本策略使用的为

[java] 
  1. org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices  

此策略会在客户端生成一个名称为SPRING_SECURITY_REMEMBER_ME_COOKIE,值进

行加密后的Cookie

二、持久化到服务器端的服务器中

     如果想使用本策略,你需要在命名空间的配置中提供一个datasource引用:

 

[html] 
  1. <http>  
  2.     ....  
  3.    <remember-me data-source-ref="someDataSource" />  
  4.  </http>  

数据库中还必须包含一个名为persistent_logins的表,表结构使用一下SQL语句创建(或者是等价的)

  
[sql] 
  1. create table persistent_logins (  
  2.   username varchar(64) not null,  
  3.   series varchar(64) primary key,  
  4.   token varchar(64) not null,  
  5.   last_used timestamp not null)  

   由于以上两种策略对应的实现类都的父类(org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices)实现了LogoutHandler接口。

   在AbstractRememberMeServices类中的 logout(...)方法中清楚了Cookie。如下所示:

         

[java] 
  1. public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {  
  2.         if (logger.isDebugEnabled()) {  
  3.             logger.debug( "Logout of user "  
  4.                     + (authentication == null ? "Unknown" : authentication.getName()));  
  5.         }  
  6.         cancelCookie(request, response);  
  7.     }  
 ...
[java] 
  1. /** 
  2.      * Sets a "cancel cookie" (with maxAge = 0) on the response to disable persistent logins. 
  3.      * 
  4.      * @param request 
  5.      * @param response 
  6.      */  
  7.     protected void cancelCookie(HttpServletRequest request, HttpServletResponse response) {  
  8.         logger.debug("Cancelling cookie");  
  9.         Cookie cookie = new Cookie(cookieName, null);  
  10.         cookie.setMaxAge(0);  
  11.         cookie.setPath(getCookiePath(request));  
  12.   
  13.         response.addCookie(cookie);  
  14.     }  
......

如果想在用户安全退出后不删除Cookie, 可以自己实现类,实现类可以继承org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices 或

 org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices。在自定义类中只重写org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices

类中的logout(...)方法即可。(但是这样 就失去了安全退出的意义了。哈哈)

转载于:https://my.oschina.net/u/861562/blog/151228

你可能感兴趣的文章
【前台】【单页跳转】整个项目实现单页面跳转,抛弃iframe
查看>>
因为你是前端程序员!
查看>>
数据库设计中的14个技巧
查看>>
Android学习系列(5)--App布局初探之简单模型
查看>>
git回退到某个历史版本
查看>>
ecshop
查看>>
HTML5基础(二)
查看>>
在GCE上安装Apache、tomcat等
查看>>
在Mac 系统下进行文件的显示和隐藏
查看>>
ue4(c++) 按钮中的文字居中的问题
查看>>
技能点
查看>>
读书笔记《乌合之众》
查看>>
Hadoop日记Day1---Hadoop介绍
查看>>
iOS 学习资料汇总
查看>>
centos7 yum安装jdk
查看>>
Bluedroid与BluZ,蓝牙测试方法的变动(基于bludroid和BlueZ的对比)
查看>>
接口和抽象类有什么区别
查看>>
Linux 下添加用户,修改权限
查看>>
请问view controller scene,该如何删除
查看>>
zzzzw_在线考试系统①准备篇
查看>>