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集群,这个框架的特点是无侵入的实现单点登陆,就是说我们之前获取 ...
随机推荐
- Android性能优化(一)
Android性能优化典范 1.大多数用户感知到的卡顿等性能问题的最主要根源都是因为渲染性能. 从设计师的角度,他们希望App能够有更多的动画,图片等时尚元素来实现流畅的用户体验. 但是Android ...
- C语言-11-可变参数的实现方案
概述 某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法 C语言实现可变参数的方案是基于标准库的 可变参数的类型 可变参数可以放在一个集合中,可以使用指针类型的参 ...
- iOS之UI--使用SWRevealViewController实现侧边菜单功能详解实例
使用SWRevealViewController实现侧边菜单功能详解 下面通过两种方法详解SWRevealViewController实现侧边菜单功能: 1.使用StoryBoard实现 2.纯代 ...
- android 之 animations 动画
android 提供的了两种机制你可以用来创建简单的动画:tweedned animation(渐变动画) 和 frame-by-frame animation(逐帧动画)(有道翻译的,汗!!!) . ...
- cxf数据压缩
一.HTTP数据的压缩 在http协议中当content-encoding对应的值为gzip,deflate,x-gzip,x-deflate时,数据是经过了压缩之后再进行传输的.有些时候我们当我们传 ...
- ehcache整合spring注解方式
一.简介 在hibernate中就是用到了ehcache 充当缓存.spring对ehcache也提供了支持,使用也比较简单,只需在spring的配置文件中将ehcache的ehcache.xml文件 ...
- Spring学习笔记之 Spring IOC容器(二) 之注入参数值,自动组件扫描方式,控制Bean实例化方式,使用注解方式
本节主要内容: 1. 给MessageBean注入参数值 2. 测试Spring自动组件扫描方式 3. 如何控制ExampleBean实例化方式 4. 使用注解方式重构Jdb ...
- malloc calloc 和 realloc
realloc()函数 原型:extern void *realloc(void *mem_address, unsigned int newsize); 语法:指针名=(数据类型*)realloc( ...
- C语言变参问题
C++中有函数重载这种方法,以供我们调用时要可以不确定实参的个数,其实 C 语言也可以,而且更高明! 我们在stdio.h 中可以看到 printf() 函数的原型: int printf(char ...
- [转]响应式网页设计:rem、em设置网页字体大小自适应
本文转自:http://www.cnblogs.com/aimyfly/archive/2013/07/19/3200742.html 「rem」是指根元素(root element,html)的字体 ...