cookie+memcached实现单点登陆
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实现单点登陆的更多相关文章
- 京东商城跨域设置Cookie实现SSO单点登陆过程
可以先看下这边文章:http://blog.chinaunix.net/uid-25508399-id-3431705.html 1.点击首页的登陆按钮跳转到京东的登陆中心https://pass ...
- SSO单点登录、跨域重定向、跨域设置Cookie、京东单点登录实例分析
最近在研究SSO单点登录技术,其中有一种就是通过js的跨域设置cookie来达到单点登录目的的,下面就已京东商城为例来解释下跨域设置cookie的过程 涉及的关键知识点: 1.jquery ajax跨 ...
- 在多点环境下使用cas实现单点登陆及登出
CAS 介绍 CAS 是 Yale 大学发起的一个开源项目,旨在为 Web 应用系统提供一种可靠的单点登录方法,CAS 在 2004 年 12 月正式成为 JA-SIG 的一个项目.CAS 具有以下特 ...
- ASP.NET 单点登陆
第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...
- ASP.NET在不同情况下实现单点登陆(SSO)的方法
第一种:同主域但不同子域之间实现单点登陆 Form验证其实是基于身份cookie的验证.客户登陆后,生成一个包含用户身份信息(包含一个ticket)的cookie,这个cookie的名字就是在web. ...
- CAS单点登陆 SSO
什么是单点登陆 SO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制.它是目前比较流行的企业业务整合的解决方 ...
- IM开发基础知识补课:正确理解前置HTTP SSO单点登陆接口的原理
1.前言 一个安全的信息系统,合法身份检查是必须环节.尤其IM这种以“人”为中心的社交体系,身份认证更是必不可少. 一些PC时代小型IM系统中,身份认证可能直接做到长连接中(也就是整个IM系统都是以长 ...
- cas单点登陆。就这一篇就够了!!!!!
前言: cas是什么我就不累赘说了.就简单说下大致的流程.首先,cas是一个独立的项目.就是一个war包,部署在tomcat上面启动就ok.然后我们要实现单点登陆,无疑是访问系统1,如果没有登录,就跳 ...
- springSession框架来实现sso单点登陆
介绍一下springsession这个框架,其实springsession框架默认的是使用redis来实现单点登陆的,但是不支持redis集群,这个框架的特点是无侵入的实现单点登陆,就是说我们之前获取 ...
随机推荐
- LeetCode 3 Longest Substring Without Repeating Characters(最长不重复子序列)
题目来源:https://leetcode.com/problems/longest-substring-without-repeating-characters/ Given a string, f ...
- Volley源码分析(2)----ImageLoader
一:imageLoader 先来看看如何使用imageloader: public void showImg(View view){ ImageView imageView = (ImageView) ...
- Visual Studio发布Web项目报错:Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The specified file could not be encrypted.
背景 Visual Studio下的Web项目 现象 发布时遇到Unable to add 'xxx' to the Web site. Unable to add file 'xxx'. The ...
- Jmeter代理录制脚本
录制的原理: 1.LR/Jmeter录制是针对网络通讯协议层面的,它只关心客户端与服务器端的通讯包2.LR/Jmeter的并发测试实际上就是并发客户端与服务器端的通讯过程3.压力是通过多进程/多线程方 ...
- j-query应用---鼠标悬停不同文字显示不同背景图片banner动画
源代码部分:注意事项:样式表的引用的路径要一致. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- 《MySQL技术内幕——SQL编程》读书笔记(二)——数据类型
对数据类型的选择将影响与数据库交互的应用程序的性能. 1.通常来说,如果一个页内可以存放尽可能多的行,那么数据库的性能就越好,因此选择一个正确的数据类型至关重要. 2.另一方面,如果在数据库中创建表时 ...
- C#XmlHelper操作Xml文档的帮助类
using System.Xml; using System.Data; namespace DotNet.Utilities { /// <summary> /// Xml的操作公共类 ...
- OSX下VirtualBox安装CentOS
1.OSX上下载安装VirtualBox 2.新建虚拟机(所有选项默认即可) 3.启动虚拟机,选择CentOS安装镜像 CentOS-6.7-x86_64-minimal.iso 此处下载的是最小镜像 ...
- kettle初探
Kettle是Pentaho的一个组件,主要用于数据库间的数据迁移,到我用过的4.2版,还不支持noSQL,不知道4.4是不是支持了. Kettle自己有三个主要组件:Spoon,Kitchen,Pa ...
- 设计模式C#实现(六)——单例模式
单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点. 构成: 1.私有的构造函数 2.私有静态的实例 3.返回实例的静态方法 public class Singleton { privat ...