前端-单点登录

145 阅读3分钟

什么是单点登录

单点登录是统一认证的一种方式

SSO核心意义就一句话:一处登录,处处登录;一处注销,处处注销

什么是统一认证

统一认证是一种集中管理多个子系统的用户身份验证和授权过程的机制,以实现用户在不同系统中一致登录和权限管理

简而言之

单点登录的机制其实是比较简单的,用一个现实中的例子做比较。

颐和园是北京著名的旅游景点。

在颐和园内部有许多独立的景点,例如“苏州街”、“佛香阁”和“德和园”,都可以在各个景点门口单独买票。

很多游客需要游玩所有德景点,这种买票方式很不方便,需要在每个景点门口排队买票,钱包拿 进拿出的,容易丢失,很不安全。

于是绝大多数游客选择在大门口买一张通票,就可以玩遍所有的景点而不需要重新再买票。他们只需要在每个景点门 口出示一下刚才买的套票就能够被允许进入每个独立的景点。

单点登录的实现方案

一般就包含以下三种:

  1. Cookies
  2. Session同步
  3. 分布式Session方式

目前的大型网站都是采用分布式Session的方式。我先从cookie的实现谈起,你就能很清楚的知道为什么需要分布式session方式实现单点登录。

Cookies

最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。 用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验,校验通过则登录当前用户。

弊端

Cookie不安全

通过加密Cookie可以保证安全性,当然这是在源代码不泄露的前提下。如果Cookie的加密算法泄露,攻击者通过伪造Cookie则可以伪造特定用户身份,这是很危险的。

不能跨域实现免登

不能跨域实现免登更是硬伤。所以,才有了以下的分布式session方案。

分布式Session方式

Session解决了Cookie不能跨域的问题,但也存在其他问题。早期的单体应用使用Session实现单点登录,但现在大部分情况下都需要集群,由于存在多台服务器,Session在多台服务器之间是不共享的,因此,还需解决Session共享的问题

解决系统之间的 Session 不共享问题有以下几种方案:

  • Tomcat集群Session全局复制(集群内每个tomcat的session完全同步)【会影响集群的性能呢,不建议】
  • 根据请求的IP进行Hash映射到对应的机器上(这就相当于请求的IP一直会访问同一个服务器)【如果服务器宕机了,会丢失了一大部分Session的数据,不建议】
  • 分布式Session,即把Session数据放在Redis中(使用Redis模拟Session)【建议】

例如,阿里有很多系统分割为多个子系统,独立部署后,不可避免的会遇到会话管理的问题,类似这样的电商网站一般采用分布式Session实现。

用户第一次登录时,将会话信息(用户Id和用户信息),比如以用户Id为Key,写入分布式Session; 用户再次登录时,获取分布式Session,是否有会话信息,如果没有则调到登录页; 一般采用Cache中间件实现,建议使用Redis,因此它有持久化功能,方便分布式Session宕机后,可以从持久化存储中加载会话信息; 存入会话时,可以设置会话保持的时间,比如15分钟,超过后自动超时;

结合Cache中间件实现的分布式Session,可以很好的模拟Session会话。

image.png