Spring Seucrity 之 Remember Me

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指定)。本策略使用的为

  1. org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices  

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

行加密后的Cookie

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

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

 

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

数据库中还必须包含一个名为persistent_logins的表,表结构使用一下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。如下所示:

         

  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.     }  
 ...
  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(...)方法即可。(但是这样 就失去了安全退出的意义了。哈哈)

Spring Seucrity 之 Remember Me

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值