单点登录详解,一文读懂SSO实现方案  第1张

什么是单点登录

英文是Single Sign On,简称SSO,指在统一帐号平台下的多个应用系统中,用户只需登录一次,即可拜候所有彼此信赖的系统。总之,多个系统,同一登岸。

通过上面描述能够看出两个要点:

统一个账号平台,也就是需要有一个集中式的SSO办事。一次登录,多系统共享登录形态,也就是多系统都能感知到用户的登录形态。利用场景

下面是用户在淘宝应用里面需要购置天猫应用里面商品的一个场景。

单点登录详解,一文读懂SSO实现方案  第2张

淘宝、天猫两个只需要一次登录

SSO是一个独立的认证中心,所有子系统都通过认证中心的登录入口停止登录,登录时带上本身的地址,子系统只承受认证中心的受权,受权通过令牌(token)实现,sso认证中心验证用户的用户名密码准确,创建全局会话(用户和SSO之间的会话)和token,token做为参数发送给各个子系统,子系统拿到token,即得到了受权,能够借此创建部分会话(用户和应用之间的会话),部分会话登录体例就是单体架构系统的登录体例(即用户和应用之间创建session会话,登录形态都保留在session中)。

常用的几种单点登录体例

单点登录的实现计划,常见的是:token+redis体例、Cookies+redis体例,Session复造,散布式Session。

下面是几种体例的简单介绍。

cookies用做办事端和客户端信息传递的前言,存在cookie不平安和不克不及实现跨域免登岸的问题(差别的域名,cookies信息不克不及彼此传递)。Session复造,只多个web办事(好比tomcat办事)之间复造session信息,那种比力费事且性能欠好,根本上不考虑。散布式session,类比散布式锁,相当于把第一次用户登录的session保留在缓存中(好比redis),登录其他系统时,按照userId查询缓存中能否已经存在该用户的session了。token+redis体例,用户和SSO成立全局会话后,把全局会话信息存入redis中,返回sessionId做为token,用户照顾token(http恳求头或者url中照顾)去获取差别系统的办事。单体架构的登录体例

大致流程如下:

用户登录系统,办事端校验session中没有用户信息,重定向到登录页面,用户输入用户名、密码。办事端把token保留在数据库中,将user数据保留在Session中,并将token写到Cookie中,那个cookie里面有token。客户端阅读器拜候办事端,cookie中就照顾token了。办事端从session里面能够取到user属性,间接放行,session里面无法取到user属性,看cookie里面有没有token,cookie里面有token且合法(token能够在数据库里面找到对应user),设置好session,放行。cookie有token但不合法(该token在数据库找不到对应user)或者没有session也没有cookie,转到登录界面。单点登录需要处理的问题

Session不共享问题单系统登录功用次要是用Session保留用户信息来实现的,但是多系统可能有多个Tomcat,而Session是依赖当前系统的Tomcat,所以系统A的Session和系统B的Session是不共享的。

单点登录详解,一文读懂SSO实现方案  第3张

单点登录的问题是session是各个系统所单独拥有的,各个系统不晓得用户能否登录,无法共享用户的登录形态。

Session共享问题,能够引入一个各个系统都能够拜候的中间件Redis,把Session数据放在Redis中,如许所有的系统就都能够晓得如今用户登录没有(利用Redis模仿Session)。

Cookie跨域的问题

Cookie是不克不及跨域的,好比说,我们恳求< https://www.google.com/>时,阅读器会主动把google.com的Cookie带过去给google的办事器,而不会把< https://www.baidu.com/>的Cookie带过去给google的办事器。

因为域名差别,用户向系统A登录后,系统A返回给阅读器的Cookie,用户再恳求系统B的时候不会将系统A的Cookie带过去。

因而只要让token在各个办事端都能领受到,就能处理跨域的问题了。

处理计划有良多,下面保举一种计划:

前端第一个恳求办事端,办事端把token返回给客户端(能够间接返回、放在响应头返回、或者放在cookie中),前端将token解析出来,之后的恳求,前端间接将token放到恳求头或者url恳求地址后面来恳求系统的办事。

单点登录流程详解单点登录详解,一文读懂SSO实现方案  第4张

下面临上图简要描述:

用户拜候系统A的受庇护资本,系统A发现用户未登录,跳转至sso认证中心,并将本身的地址做为参数。sso认证中心发现用户未登录,将用户引导至登录页面。用户输入用户名密码提交登录申请。sso认证中心校验用户信息,创建用户与sso认证中心之间的会话,称为全局会话,同时创建受权令牌。sso认证中心带着令牌跳转回最后的恳求地址(系统A)。系统A拿到令牌,去sso认证中心校验令牌能否有效。sso认证中心校验令牌,返回有效,注册系统A。系统A利用该令牌创建与用户的会话,称为部分会话,返回该令牌。用户和系统A交互,阅读器把token放在head中或者url上。用户拜候系统B的受庇护资本。系统B发现用户未登录,跳转至sso认证中心,并将本身的地址做为参数。sso认证中心按照token发现用户已登录,跳转回系统B的地址,并附上令牌。系统B拿到令牌,去sso认证中心校验令牌能否有效。sso认证中心校验令牌,返回有效,注册系统B。系统B利用该令牌创建与用户的部分会话,返回该令牌。用户和系统B交互,阅读器把token放在head中或者url上。

用户登录胜利之后,会与sso认证中心及各个子系统成立会话,用户与sso认证中心成立的会话称为全局会话,用户与各个子系统成立的会话称为部分会话,部分会话成立之后,用户拜候子系统受庇护资本将不再通过sso认证中心,全局会话与部分会话有如下约束关系:

部分会话存在,全局会话必然存在。全局会话存在,部分会话纷歧定存在。全局会话销毁,部分会话必需销毁。

那里我们没有用cookie做为token的载体,而是利用了恳求头或者url,为领会决跨域问题。

总结

散布式架构招致了单点登录,单点登录就是散布式登录,便是在散布式系统中,只要登录一个系统,其他所有系统共享登录形态。

单点登录就是在多个系统中,用户只需一次登录,各个系统即可感知该用户已经登录。

其实SSO认证中心就类似一个直达站,我们能够看到,散布式系统的办理都是通过一个同一的办事来停止办理的,正所谓合久必分,分久必合;集中式办理,散布式干活。

单点登录详解,一文读懂SSO实现方案  第5张