单点登录实现的几种方式及原理【单点登录】

文章目录

  • 一、什么是单点登录
  • 二、单点登录原理
  • 三、单点登录实现方式
    • 1.基于Cookie+Redis的单点登录
    • 2.分布式session方式实现单点登录
    • 3.token验证
    • 4.session广播
    • 5.CAS 中央认证服务

一、什么是单点登录

单点登录的英文名叫做:Single Sign On(简称SSO),指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统。简而言之,多个系统,统一登陆。

为什么需要做单点登录系统呢?在一些互联网公司中,公司旗下可能会有多个子系统,每个登陆实现统一管理,多个账户信息统一管理 SSO单点登陆认证授权系统。比如阿里系的淘宝和天猫,显而易见这是两个系统,但是在使用过程中,只要你登录了淘宝,同时也意味着登录了天猫,如果每个子系统都需要登录认证,用户早就疯了,所以我们要解决的问题就是,用户只需要登录一次就可以访问所有相互信任的应用系统。

二、单点登录原理

sso需要一个独立的认证中心,所有子系统都通过认证中心的登录入口进行登录,登录时带上自己的地址,子系统只接受认证中心的授权,授权通过令牌(token)实现,sso认证中心验证用户的用户名密码正确,创建全局会话和token,token作为参数发送给各个子系统,子系统拿到token,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。
单点登录实现的几种方式及原理【单点登录】_第1张图片

三、单点登录实现方式

单点登录的实现方案,一般就包含:Cookies,Session同步,分布式Session,目前的网站采用比较多的方式是token令牌和分布式Session的方式。

1.基于Cookie+Redis的单点登录

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

redis:在key:生成唯一随机值(ip、用户id等等),在value:用户数据

cookie:把redis里面生成key值放到cookie里面
单点登录实现的几种方式及原理【单点登录】_第2张图片
下面对上图简要描述

  1. 用户访问系统1的受保护资源,系统1发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
  2. sso认证中心发现用户未登录,将用户引导至登录页面
  3. 用户输入用户名密码提交登录申请
  4. sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建授权令牌
  5. sso认证中心带着令牌跳转会最初的请求地址(系统1)
  6. 系统1拿到令牌,去sso认证中心校验令牌是否有效
  7. sso认证中心校验令牌,返回有效,注册系统1
  8. 系统1使用该令牌创建与用户的会话,称为局部会话,返回受保护资源
  9. 用户访问系统2的受保护资源
  10. 系统2发现用户未登录,跳转至sso认证中心,并将自己的地址作为参数
  11. sso认证中心发现用户已登录,跳转回系统2的地址,并附上令牌
  12. 系统2拿到令牌,去sso认证中心校验令牌是否有效
  13. sso认证中心校验令牌,返回有效,注册系统2
  14. 系统2使用该令牌创建与用户的局部会话,返回受保护资源

通过加密Cookie可以保证安全性,当然这是在源代码不泄露的前提下。如果Cookie的加密算法泄露,攻击者可以通过伪造Cookie伪造成特定用户身份。 对于问题二更是硬伤,所以才有了以下的分布式session方案。

2.分布式session方式实现单点登录

流程运行:

(1) 用户第一次登录时,将会话信息(用户Id和用户信息),比如以用户Id为Key,写入分布式Session;

(2) 用户再次登录时,获取分布式Session,是否有会话信息,如果没有则调到登录页;

(3) 一般采用Cache中间件实现,建议使用Redis,因此它有持久化功能,方便分布式Session宕机后,可以从持久化存储中加载会话信息;

(4) 存入会话时,可以设置会话保持的时间,比如15分钟,超过后自动超时;

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

3.token验证

  1. 在项目某个模块进行登录,登录之后,按照jwt规则生成字待串,把登录之后用户包含到生成字符串里面,把字符串返回

(1)可以把宁符串通过cookie返回
(2)把字符串通过地址栏返回

  1. 前端收到token之后将token存储在自己的请求头之中或者url后面,这样每次请求都可以带着token请求。

  2. 再去访问项目其他模块,获取地址栏或者请求头里面的token,根据宇符串获职用户信息。

  3. 同时为了设置失效时间,可以将token放在redis中,设置失效时间,判断过期。

4.session广播

方法太老使用麻烦,了解即可。

5.CAS 中央认证服务

https://blog.csdn.net/wang121213145/article/details/124822899?spm=1001.2014.3001.5501

你可能感兴趣的:(SSO,java,redis,安全)