zoukankan      html  css  js  c++  java
  • SpringSecurity的rememberme

    记住我功能原理分析
    还记得前面咱们分析认证流程时,提到的记住我功能吗?

     现在继续跟踪找到AbstractRememberMeServices对象的loginSuccess方法:

     

     再点进去上面if判断中的rememberMeRequested方法,还在当前类中:

     

    如果上面方法返回true,就表示页面勾选了记住我选项了。
    继续顺着调用的方法找到PersistentTokenBasedRememberMeServices的onLoginSuccess方法:

     

    注意name和value属性的值不要写错哦!

    先测试一下,认证通过后,关掉浏览器,再次打开页面,发现还要认证!为什么没有起作用呢?
    这是因为remember me功能使用的过滤器RememberMeAuthenticationFilter默认是不开启的!
     开启remember me过滤器

    <security:remember-me token-validity-seconds="60"></security:remember-me>

    说明:RememberMeAuthenticationFilter中功能非常简单,会在打开浏览器时,自动判断是否认证,如果没有则
    调用autoLogin进行自动认证。

     remember me 安全性分析

    记住我功能方便是大家看得见的,但是安全性却令人担忧。因为 Cookie毕竟是保存在客户端的,很容易盗取,而且
    cookie的值还与用户名、密码这些敏感数据相关,虽然加密了,但是将敏感信息存在客户端,还是不太安全。那么
    这就要提醒喜欢使用此功能的,用完网站要及时手动退出登录,清空认证信息。
    此外,SpringSecurity还提供了remember me的另一种相对更安全的实现机制 :在客户端的cookie中,仅保存一个
    无意义的加密串(与用户名、密码等敏感数据无关),然后在db中保存该加密串-用户信息的对应关系,自动登录
    时,用cookie中的加密串,到db中验证,如果通过,自动登录才算通过。

    持久化remember me信息
    创建一张表,注意这张表的名称和字段都是固定的,不要修改。

     <security:remember-me token-validity-seconds="60"
                                  data-source-ref="dataSource"
             remember-me-parameter="remember-me"></security:remember-me>
    CREATE TABLE `persistent_logins` (
    `username` varchar(64) NOT NULL,
    `series` varchar(64) NOT NULL,
    `token` varchar(64) NOT NULL,
    `last_used` timestamp NOT NULL,
    PRIMARY KEY (`series`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8

  • 相关阅读:
    HDU 3501 Calculation 2 ——Dirichlet积
    BZOJ 1101 [POI2007]Zap ——Dirichlet积
    BZOJ 1257 [CQOI2007]余数之和sum ——Dirichlet积
    SGU 194 Reactor Cooling ——网络流
    BZOJ 1497 [NOI2006]最大获利 ——网络流
    BZOJ 2705 [SDOI2012]Longge的问题 ——Dirichlet积
    BZOJ 1653 [Usaco2006 Feb]Backward Digit Sums ——搜索
    BZOJ 1861 [Zjoi2006]Book 书架 ——Splay
    BZOJ 3130 [Sdoi2013]费用流 ——网络流
    BZOJ 3990 [SDOI2015]排序 ——搜索
  • 原文地址:https://www.cnblogs.com/dalianpai/p/12378075.html
Copyright © 2011-2022 走看看