sso单点登录系统(精华篇)

(1)概念

单点登录SSO,说的是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任。

(2)单点登录的要点

①存储信任;

②验证信任;

(3)实现单点登录的三种方式

① 以cookie作为凭证

最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。

用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie进行校验,校验通过则登录当前用户。

缺点:

cookie不安全
通过加密可以保证安全性,但如果对方掌握了解密算法就完蛋了。

不能跨域实现免登
② 通过JSONP实现

对于跨域问题,可以使用JSONP实现。用户在父应用中登录后,跟session匹配的cookie会存到客户端中,当用户需要登录子应用的时候,授权应用访问父应用提供的JSONP接口,并在请求中带上父应用域名下的cookie,父应用接收到请求,验证用户的登录状态,返回加密的信息,子应用通过解析返回来的加密信息来验证用户,如果通过验证则登录用户。

缺点:

这种方法虽然能解决跨域问题,但是治标不治本,没有解决cookie安全性的问题。

③ 通过页面重定向的方式

最后一种介绍的方式,是通过父应用和子应用来回重定向进行通信,实现信息的安全传递。

父应用提供一个GET方式的登录接口A(此时的父应用接口固定,攻击者无法去伪造),用户通过子应用重定向连接的方式访问这个接口,如果用户还没有登录,则返回一个登录页面,用户输入账号密码进行登录,如果用户已经登录了,则生成加密的token,并且重定向到子应用提供的验证token的接口B(此时的子应用接口固定,攻击者无法去伪造),通过解密和校验之后,子应用登录当前用户。

缺点:

这种方式较前面的两种方式,是解决了安全性和跨域的问题,但是并没有前面两种方式简单,安全与方便,本来就是矛盾的。

(4)使用独立登录系统

一般来说,大型应用会把授权的逻辑和用户信息的相关逻辑独立成一个应用,称为用户中心。用户中心不处理业务逻辑,只是处理用户信息的管理以及授权给第三方应用。第三方应用需要登录的时候,则把用户的登录请求转发给用户中心进行处理,用户处理完毕后返回凭证,第三方应用验证凭证,通过后就登录用户。

(5)sso(单点登录)与OAuth2.0(授权)的区别?

① sso(单点登录)

通常处理的是一个公司的不同应用间的访问登录问题,如企业应用有很多子系统,只需登录一个系统,就可以实现不同子系统间的跳转,而避免了登录操作;
通过cookie、jsonp、重定向来实现;

② OAuth2.0(授权)

解决的是服务提供方(如微信)给第三方应用授权的问题,简称微信登录;
是一种具体的协议,只是为用户资源的授权提供了一个安全的、开放的而又简易的标准,OAuth2.0(授权)为客户开发者开发web应用,桌面应用程序,移动应用及客厅设备提供特定的授权流程。

传统的登录遇到问题过程:

首先我我们访问登录页面,输入用户名和密码,开始提交表单,提交的表单到数据库中进行验证,如果对比不正确,重定向到登录页面重新登陆,如果登录成功,那么进入系统,将用户信息写入session中,当我们访问用户中心时,都要强制用户登录,通常我们使用拦截器对用户身份进行验证。验证通过后,如果session中有用户信息,说明是登录状态,这个项目如果是简单的,只有一个tomcat就能部署的话,这一套逻辑就没有任何问题,如果说我们用到集群的环境当中,需要多个tomcat,这时我们需要处理session共享问题,tomcat服务器需要向其他tomcat广播自己的session信息,但是同样有一个问题,就是session共享信息有一个上线,比如说我们配置多个tomcat,这时session信息大量复制,然后影响到tomcat性能,严重的话还有可能引起内网风暴,这是我们需要专门有一台服务器放session,将session放在一块,进行自己模拟session,session是key,value形式存储,我门将session放在redis中去。

单点登录独立系统具体流程:我们将模拟的session放到redis中去,那么他的key是什么呢?通过不同的sessionid判断不同的session,我们需要不同的sessionId让系统之间进行独立,这是我们可以通过uuid保证sessionId的唯一性,其实就是我们说的令牌token,token本质上就是一个sessionId,value是用户信息,我们还需要设置session的过期时间,将token保存到cookie中去,用户拿着token进行身份验证。比如说我们查看一个订单信息,我们需要从cookie中取出token,根据token到redis中进行用户查询,如果token不存在,跳转登录页面,如果存在,重新调整sessionId的过期时间,显示订单信息。

上一篇:VCSA重置SSO用户密码


下一篇:关于flask实现一个sso单点登录demo