10年的时候在iteye的第一篇文章记录了一下当时怎么实现我们系统的单点登陆。不过那个时候文章写的不好,思路也很浮躁,很难看懂,在csdn的第一篇技术博客打算重新温顾一下当时实现单点登陆的思路。先来看看什么叫单点登陆

单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。 --百度百科

为什么要实现单点登陆?

从10年新版改造后,我们把一些辅助功能垂直切分成单独的应用,跑在不同的应用服务器集群中。实现单点登陆,以保证各个应用间共享登陆状态和用户信息。

使用cookie实现单点登陆会遇到哪些问题?

第一个问题是cookie的过期时间设置的问题,要实现单点登陆,有很多种方式,我们采用让根域名下的所有的应用共享cookie信息,设置cookie的过期时间时,有两种情况:一种是过期时间为一个小于等于零的数值,这样,cookie的信息是保存在内存中的,浏览器关闭,cookie信息就失效了。但是如果浏览器一直不关闭,cookie信息会一直在内存中不失效,这将给用户的账户安全带来极大的隐患。另外一种是过期时间为一个正数,设置成正数时,cookie信息会保存在用户的硬盘上,在cookie还未过期时,即使用户关闭浏览器,只要重新打开浏览器访问,cookie信息会被重新读取,登陆状态恢复。这样,也会存在安全隐患。仅仅通过cookie来实现单点登陆,还是存在风险的!正数不好,零和负数也不好,那设置成啥值呢?又该用怎么样的方式来解决呢?实际上我们使用cookie+memcached有两种实现方式供参考。

1、模仿session的会话维护的方式,用户关闭浏览器,或者会话时间一段时间内不活动,会话就断开了。我们将cookie的过期时间设置为一个小于等于0的数值,这样在用户关闭浏览器时,会话就结束了。而将用户信息保存到memcache中,如果用户30分钟不活动,memcached中的值自动过期,用户的会话也就结束了。所以判断用户的会话信息是否有效时需要经过两个逻辑,一个是判断cookie信息是否有效,一个是看memcached中是否有用户信息。两个条件都符合用户的会话才有效。但是这种用法会有一个问题:memcachd是缓存,在设置过期时间创建之后,一到了过期时间,不管用户的cookie信息是否依然存在,用户是否依然在活动,memcached的信息依然会删除。这就导致了用户活动一段时间之后又要重新登录。所以用户活动每次获取登录状态时都要重新设置用户信息到缓存中。这个就解决了我们上面说的cookie信息的风险的问题。

2、使用memcached只用来保存用户信息,以免太过频繁的通过接口取用户数据,而为了解决cookie过期的问题,我们还需要将系统的时间long值保存在cookie的信息中。以此要记录用户最后一次活动的时间,再根据逻辑判断用户的活动时间是否超过了指定的时间段。这个很好理解,我把你这次活动的时间保存在cookie里面,当你下一次活动时,再把上次保存的时间取出来,加上我指定的会话过期的时长,比如20分钟,是否在当前时间之前,如果是,那会话就过期了,需要重新登录。这样每次用户活动是需要刷新的是cookie,而不是memcached信息了,这样memcached的缓存时间可以自行设定。

第二个问题是cookie的安全问题。cookie始终是在用户的浏览器保存的,是由客户端来管理的,现在找个能修改cookie信息的工具非常容易,怎么来防止cookie信息被篡改以保证单点登陆的安全?我们采用了互联网中最为普遍的验证签名的方式来进行的,将登陆的cookie信息使用一个MD5(私钥+信息字符)的算法,这样,我们的cookie信息如果被删除了,会话断开了。如果被篡改了,验签不通过,会话也断开。

cookie+memcached方式实现单点登陆的整体流程(图画的弱爆了,不献丑了)

以cookie控制过期的方式为例子,memcached控制过期的方式反三一下。用户登录时,生成COOKIE信息sso_login:memberId|time|Md5(info) 和设置缓存,用户每进行一次请求,首先取出COOKIE,验证签名数据,取出COOKIE的生成时间与现在的时间进行对比,验证是否过期;再次,若验证通过则获取缓存中的用户信息并重新生成cookie,主要是刷新cookie的生成时间,若验证不通过或者过期,则进入用户登录流程。关键点都在那个cookie的格式上了,cookie的格式为 cookie.name=sso_login,value=memberId|time|Md5(info)

cookie+memcached实现单点登陆的更多相关文章

  1. 京东商城跨域设置Cookie实现SSO单点登陆过程

    可以先看下这边文章:http://blog.chinaunix.net/uid-25508399-id-3431705.html   1.点击首页的登陆按钮跳转到京东的登陆中心https://pass ...

  2. SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析

    最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1.jquery ajax跨 ...

  3. 在多点环境下使用cas实现单点登陆及登出

    CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以下特 ...

  4. ASP.NET 单点登陆

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...

  5. ASP.NET在不同情况下实现单点登陆(SSO)的方法

    第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...

  6. CAS单点登陆 SSO

    什么是单点登陆 SO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方 ...

  7. IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理

    1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...

  8. cas单点登陆。就这一篇就够了!!!!!

    前言: cas是什么我就不累赘说了.就简单说下大致的流程.首先,cas是一个独立的项目.就是一个war包,部署在tomcat上面启动就ok.然后我们要实现单点登陆,无疑是访问系统1,如果没有登录,就跳 ...

  9. springSession框架来实现sso单点登陆

    介绍一下springsession这个框架,其实springsession框架默认的是使用redis来实现单点登陆的,但是不支持redis集群,这个框架的特点是无侵入的实现单点登陆,就是说我们之前获取 ...

随机推荐

  1. iOS开发--隐藏(去除)导航栏底部横线

    iOS开发大部分情况下会使用到导航栏,由于我司的app导航栏需要与下面紧挨着的窗口颜色一致,导航栏底部的横线就会影响这个美观,LZ使用了以下方法.觉得不错,分享来给小伙伴们. 1)声明UIImageV ...

  2. Erlang 的新数据结构 map 浅析

    更新:文中示例代码直接从Joe的新版 Erlang 书中摘抄而来,其中模式匹配的代码有错误,现已纠正.应该用 := 匹配字段,而不是 => . 即将发布的 Erlang 17 最大变化之一包括新 ...

  3. Effective Java 47 Know and use the libraries

    Advantages of use the libraries By using a standard library, you take advantage of the knowledge of ...

  4. 关于Redis info的参数总结

    Redis官网对 info 已经讲解的比较清楚的,参考文档 .可以看到,info的输出结果是分几块的,有Servers.Clients.Memory等等,通过info后面接这些参数,可以指定输出某一块 ...

  5. Vrrp协议

    一.简介 VRRP(Virtual Router Redundancy Protocol)协议是用于实现路由器冗余的协议,最新协议在RFC3768中定义,原来的定义RFC2338被废除,新协议相对还简 ...

  6. UVALive 6073 Math Magic

                                                  6073 Math MagicYesterday, my teacher taught us about m ...

  7. linux sed命令

    一.初识sed 在部署openstack的过程中,会接触到大量的sed命令,比如 # Bind MySQL service to all network interfaces. sed -i 's/1 ...

  8. UESTC 913 握手 Havel定理+优先队列

    给定一个非负整数序列{dn},若存在一个无向图使得图中各点的度与此序列一一对应,则称此序列可图化.进一步,若图为简单图,则称此序列可简单图化. 此题因为是无自环无重边,所以是简单图.用判定简单图可图化 ...

  9. 通过JDBC进行简单的增删改查(二)

    本章笔记更易理解和学习,也是我第一次初学的笔记. package javastudy; import java.sql.Connection; import java.sql.DriverManage ...

  10. [cb]ScriptableObject 序列化

    ScriptableObject ScriptableObject是一个类,它允许你存储大量用于共享的数据独立脚本实例,不要迷惑这个类同样可以叫做 SerializableObject,可以理解成是一 ...