背景


在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,用户用不同的账号即可登录,很方便。
但随着企业的发展,用到的系统随之增多,用户在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于用户来说,很不方便。于是,就想到是不是可以在一个系统登录,其他系统就不用登录了呢?这就是单点登录要解决的问题。

概念


单点登录英文全称Single Sign On,简称就是SSO。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。例如,网页登录了淘宝账号,天猫,钉钉等阿里系应用都不用再二次登录了。 SSO核心意义就一句话:一处登录,处处登录;一处注销,处处注销。就是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,即用户只需要记住一组用户名和密码就可以登录所有有权限的系统。

可使用一幅图形象表现有误单点登录的系统的区别

技术实现


基于Cookie的单点登录

这是最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。 用户登录父应用之后,应用返回一个加密的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)【建议】

由上可以得出,当前大部分单点登录系统运行流程如下图

  1. 用户登录系统应用1,发现未登录,重定向到认证系统登录,认证系统验证用户名和密码等信息通过,返回用户一个ticket,并将Session存入Redis或其他缓存容器
  2. 用户携带ticket登录系统应用2,应用系统2到认证系统进行ticket验证,若存在该ticket对应的Session,则登录成功
  3. 用户携带ticket登录系统应用3,应用系统3到认证系统进行ticket验证,若存在该ticket对应的Session,则登录成功

常见方案


CAS

CAS(Central Authentication Service) 是 Yale 大学发起的一个开源项目,是单点登录的一种现方式,分为CAS服务端和CAS客户端

具体流程如下:

  1. 用户访问app系统,app系统是需要登录的,但用户现在没有登录。
  2. 跳转到CAS server,即SSO登录系统,以后图中的CAS Server我们统一叫做SSO系统。 SSO系统也没有登录,弹出用户登录页。
  3. 用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
  4. SSO系统登录完成后会生成一个ST(Service Ticket),然后跳转到app系统,同时将ST作为参数传递给app系统。
  5. app系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
  6. SSO系统返回验证结果
  7. 验证通过后,app系统将登录状态写入session并设置app域下的Cookie。

至此,跨域单点登录就完成了。以后我们再访问app系统时,app就是登录的。接下来,我们再看看访问app2系统时的流程。

  1. 用户访问app2系统,app2系统没有登录,跳转到SSO。
  2. 由于SSO已经登录了,不需要重新登录认证。
  3. SSO生成ST,浏览器跳转到app2系统,并将ST作为参数传递给app2。
  4. app2拿到ST,后台访问SSO,验证ST是否有效。
  5. SSO系统返回验证结果
  6. 验证成功后,app2将登录状态写入session,并在app2域下写入Cookie。
    这样,app2系统不需要走登录流程,就已经是登录了。SSO,app和app2在不同的域,它们之间的session不共享也是没问题的。

oauth2(第三方登录授权)

OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息

主要应用于第三方应用授权登录:在APP或者网页接入一些第三方应用时,时常会需要用户登录另一个合作平台,比如QQ,微博,微信的授权登录,第三方应用通过oauth2方式获取用户信息

详细步骤如下(以微信登录为例):

  1. 用户访问第三方网站,第三方应用需要用户登录验证,用户选择微信授权登录
  2. 第三方应用发起微信登录授权请求
  3. 微信服务器拉起用户授权确认页面
  4. 用户授权通过
  5. 微信发送请求到第三方应用redirctUrl(第2步填写redirct_uri参数),返回凭证code与state(第2步自定义)
  6. 第三方应用获取到code之后,根据code获取accessToken
  7. 根据accessToken获取用户信息
  8. 对用户信息进行处理(用户是否第一次登录,保存用户信息,自定义token,session处理等)
  9. 返回结果(步骤1对应url或者重定向到首页)

JWT(客户端token)

难度较大,需要了解很多协议
Json web token (JWT),是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标((RFC
7519)。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
基于JWT认证协议,自己开发SSO服务和权限控制。

以上为常见的单点登录解决方案,当然,在使用的同时也会和其他的权限授权认证的安全框架整合实现,常见的安全框架有

  • Spring Security
  • Shiro

部分内容引用自
[1] https://yq.aliyun.com/articles/636281
[2] https://www.jianshu.com/p/4f5fcddb4106

单点登录(一)—— 单点登录及常见解决方案原理(CAS、oauth2、JWT)相关推荐

  1. 图文剖析:单点登录常见解决方案实现原理

    作者:一叶知秋 https://muyinchen.github.io/ 一.共享Session 二.基于OpenId的单点登录 三.基于Cookie的OpenId存储方案 四.B/S多域名环境下的单 ...

  2. 转)SSO单点登录在互联网电商应用中的解决方案(基于CAS的改造)

    电商平台中无论是前端还是后端会存在大量的业务应用,在整个交易的过程中请求是在各个业务应用中流转的,对于用户来讲只需要登录一次就可以访问所有的业务,这就是单点登录SSO. 单点登录开源有很多的解决方案, ...

  3. 单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造

    单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造 参考文章: (1)单点登录(SSO)解决方案之 CAS服务端数据源设置及页面改造 (2)https://www.cnblogs.com/ ...

  4. 单点登录(Single Sign On)解决方案

    需求 多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. A 网站和 B 网站是同一家公司的关联服务.现在要求,用户只要在其中一个网站登录,再访问另一个网站就会自动登录,请问怎么实现 ...

  5. jwt单点登录_单点登录SSO技术选型

    一些人存在的意义总归是让另一些人成长,然后消失. --刘同<谁的青春不迷茫> 1.单点登录是什么? 单点登录主要用于多系统集成,即在多个系统中,用户只需要到一个中央服务器登录一次即可访问这 ...

  6. 单点登录和第三方登录

    最近做了一些登录相关的工作,顺便看了下常见的登录方案,这里主要从后端的角度梳理一些技术细节. 文章目录 单点登录 第三方登录 单点登录 单点登录(Single Sign On),简称SSO,是目前比较 ...

  7. 谷粒商城笔记+踩坑(17)——【认证模块】登录,用户名密码登录+微博社交登录+SpringSession+xxl-sso单点登录

    导航: 谷粒商城笔记+踩坑汇总篇 目录 5. 用户名密码登录 5.1[认证模块]登录业务 5.1.1 模型类,接收用户名密码 5.1.2 feign客户端新增登录功能 5.1.3 LoginContr ...

  8. 跨平台第三方平台登录和单点登录

    跨平台第三方平台登录和单点登录 官方介绍: 单点登录:简称为 SSO,是比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. 个人 ...

  9. 啥是单点登录及单点登录原理

    一.单系统登录机制 1.http无状态协议 web应用采用browser/server架构,http作为通信协议.http是无状态协议,浏览器的每一次请求,服务器会独立处理,不与之前或之后的请求产生关 ...

最新文章

  1. 基于自动驾驶车辆的NVIDIA-TensorRT推理实时优化
  2. linux守护进程的创建
  3. iOS ASIHTTPRequest用https协议加密请求
  4. SQL SERVER 数据库 怎么从一个服务器一个表中把数据插入到另一个服务器中的一个表内(纯复制)...
  5. 学长毕业日记 :本科毕业论文写成博士论文的神操作20170407
  6. 逃离数学焦虑、算法选择,思考做好机器学习项目的3个核心问题
  7. 虚幻引擎学习之路:粒子系统篇(二)
  8. HDU - 3613 Best Reward(字符串哈希)
  9. redis module模块简单使用
  10. python123循环结构_来学Python啦,大话循环结构~
  11. C# 使用数据库SQLite
  12. Extensions in UWP Community Toolkit - ViewExtensions
  13. linux新硬盘分区及格式化和挂载分区到目录的方法
  14. 交叉熵损失函数(Cross Entropy Error Function)与均方差损失函数(Mean Squared Error)
  15. 教职工员工管理MySQL实训_数据库课程设计---教职工管理系统
  16. MySQL 百万级/千万级表 全量更新
  17. HTML5之audio实战,网页音乐播放器开发
  18. 网易秘密启动“D计划” 引爆新一轮电子邮箱大战
  19. 什么性格的人适合做产品经理?
  20. 五道口宅男 - Android NDK and OpenCV Development With Android Studio

热门文章

  1. django-admin动态多选框表单实现
  2. oracle 8.0版本下载,Oracle Linux 8.0 发布
  3. spring boot 分布式事务解决方案
  4. 这几种方法教你快速分辨油烟净化器质量好坏
  5. 物联网AI MicroPython学习之语法utime时间
  6. impdp导入排除指定表
  7. ubuntu下最优秀的截屏软件scrot
  8. Java计算机毕业设计甜心驿站饮品信息管理源码+系统+数据库+lw文档
  9. logo像闪电的html编译器,基于Html5 Canvas绘制逼真的闪电动画特效
  10. 文艺青年转行程序员,一路狂奔