zoukankan      html  css  js  c++  java
  • Spring Security 之 Remember-Me (记住我)

    效果在用户的session(会话)过期或者浏览器关闭后,应用程序仍能记住它。用户可选择是否被记住。(在登录界面选择)
     
    “记住”是什么意思?
        就是下次你再访问的时候,直接进入系统,而不需要输入用户名密码。
     
    实现原理:使用一个remember-me cookie存储在浏览器内,用户通过该浏览器再次访问网站的时候,网站识别出remember-me cookie,此用户自动登录。
     
    两种方式:
    ①基于Token  => 依赖于“加密签名”,即服务端根据参数生成一个Token进行对比
    ②基于持久化 => 依赖于数据存储,即服务端将保留Token
     
    一、基于Token的Remember-Me
    Remember-me cookie : Base64编码过的字符串,存储在浏览器内
    包含以下信息:
    • 用户名
    • 过期时间
    • MD5Hash码(token/signature) =>由过期时间、用户名、密码、<remember-me>元素秘钥等字段生成
    注意:cookie中并不包含密码,有包含就危险了,虽然MD5码是由密码字段参与生成的,不过MD5是单向的,几乎不可能被破解,况且又不是只有密码,还有其他字段存在
     
    Cookie都是不可靠的,如何应用于安全服务?
    答:可以将cookie中的token和后台生成的token进行对比,实行“校验”操作
     
    操作流程:
        ①用户将Remeber-me cookie发到后台,即包括用户名,过期时间,token
        ②后台通过用户名获取到对应密码
        ③后台利用用户名、密码、过期时间、<remember-me>元素的key这几个字段生成Token
        ④将生成的Token与Cookie中的Token进行对比
        ⑤如果Token相同,则用户自动登录系统
     
    为何安全?
    答:因为如果不知道key和密码基本不可能生成Token,其一,key只有此应用知道,写死在配置文件里的,其二,密码只有用户本人知道。
     
    绝对安全吗?
    答:不是的,按照上面的逻辑,只要token是对的,就能登录。这就有问题了,如果token不是本人在用呢?实际上token可能会被窃取。
    想象这样一种情况,有个恶意用户通过网络嗅探,获取到了某个用户发请求时候带上的token,然后他也在某天发请求的时候也带上这个token,是不是就直接登录了呢?
     
    那怎么防止Token被人嗅探到呢?
    答:利用SSL安全协议,即https,用户和服务端的连接是安全的,收发的信息不会被嗅探到。
     
    二、基于Persistent(持久化)的Remember-Me
       
    Remember-me cookie:
    • Series identifiers(序列化标识符)=> 标识用户初始化登录,不会改变
    • Token => 每次使用Remember-Me特性后,都会改变(每次自动登录都会改变Token)
     
    与基于Token的Remember-Me有何不同?
        ①基于Token的Token是通过MD5生成。而基于Persistent的Token是直接根据从数据库中取
        ②基于Token的Token(或者叫签名)除非到达过期时间,或者用户更改了密码,否则不会过期。而基于Persistent的Token,是每次用完就过期了,后台会生成新的Token存储在数据库供下次自动登录使用。
     
  • 相关阅读:
    反转链表
    《Java JDK7 学习笔记》课后练习题1
    《Java JDK7 学习笔记》课后练习题2
    《java JDK7 学习笔记》课后练习题3
    SQL与NoSQL(关系型与非关系型)数据库的区别
    编程中编码的来源及发展
    JDK7学习笔记之基础类型
    《java JDK7学习笔记》之跨平台与路径设置
    《java jdk7学习笔记》之java三大平台
    VS2015安装之后加装SQL SERVER2014的步骤
  • 原文地址:https://www.cnblogs.com/longfurcat/p/9281783.html
Copyright © 2011-2022 走看看