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. Objective-c 基础框架(初学者-总结)

    一个框架其实就是一个软件包,它包含了多个类.Mac 操作系统提供了几十个框架,主要帮助开发者快速的在Mac 系统上开发应用程序.其中包括一些基础框架,就是为所有程序开发提供基础的框架,其中几个常用的类 ...

  2. Swift控制流

    本文简单的介绍swift一些基本语法的使用,在本文中不会做更深的剖析,只提及一些语法的简单的使用,快速学会编写swift程序.高手请绕路走嘿嘿 常量与变量: swift中定义所有的变量使用var,定义 ...

  3. java 之 file类的一些方法

    File类: File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成.但是File不能访问文件内容本身. 访问文件和目录: 1. ...

  4. windows 注册表编程

    例子:将本地计算机的Monitor ID写入到注册表中 (1)获取MonitorID BOOLEAN DeviceMonitorService::EnumClassDevice(const GUID ...

  5. javascript元素绑定事件

    js元素绑定事件   想给一个元素绑定一个方法之后,在绑定一个方法而且不被覆盖 window.onload = function () { alert('a'); } window.onlaod=fu ...

  6. linux内核调优参考

    对于新部署的机器,需要做一些基本的调优操作,以更改一些默认配置带来的性能问题 1 修改打开文件数 root@mysql:/data/tools/db# vim /etc/security/limits ...

  7. Ajax详解及其案例分析------如何获得Ajax对象,使用Ajax对象发送GET和POST请求,校验用户名,POST和GET请求时的乱码处理,实现级联的下拉列表

    本节主要内容预览: 1 获得Ajax对象 2 使用Ajax对象发送GET请求 3 使用Ajax对象发送POST请求 4 使用Ajax校验用户名 5 POST请求时的乱码处理 6 GET请求时的乱码处理 ...

  8. html插入链接

    每个网页都已一个地址,用URL()标识,通常在网站内部创建链接时,通常使用相对地址 内部链接 <a href="链接地址" target="目标窗口的打开方式(-s ...

  9. FZU Problem 2150 Fire Game

    Problem 2150 Fire Game Accept: 145    Submit: 542 Time Limit: 1000 mSec    Memory Limit : 32768 KB P ...

  10. 迅为iTOP-4412开发板Ubuntu操作系统烧写方法

    本文转自:http://www.topeetboard.com Ubuntu系统烧写硬件平台:iTOP4412开发板 需要准备:串口线.读卡器.一张SD卡最好是2G(自备).另外一张卡(大于等于2G都 ...