龙空技术网

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

晨心尘 354

前言:

现时小伙伴们对“用户登录的英文是什么”大概比较注意,你们都想要学习一些“用户登录的英文是什么”的相关资讯。那么小编在网络上汇集了一些对于“用户登录的英文是什么””的相关文章,希望你们能喜欢,姐妹们一起来学习一下吧!

什么是单点登录

英文是Single Sign On,简称SSO,指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的系统。总之,多个系统,统一登陆。

通过上面描述可以看出两个要点:

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

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

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

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是不共享的。

单点登录的问题是session是各个系统所独自拥有的,各个系统不知道用户是否登录,无法共享用户的登录状态。

Session共享问题,可以引入一个各个系统都可以访问的中间件Redis,把Session数据放在Redis中,这样所有的系统就都可以知道现在用户登录没有(使用Redis模拟Session)。

Cookie跨域的问题

Cookie是不能跨域的,比如说,我们请求< ;时,浏览器会自动把google.com的Cookie带过去给google的服务器,而不会把< ;的Cookie带过去给google的服务器。

因为域名不同,用户向系统A登录后,系统A返回给浏览器的Cookie,用户再请求系统B的时候不会将系统A的Cookie带过去。

因此只要让token在各个服务端都能接收到,就能解决跨域的问题了。

解决方案有很多,下面推荐一种方案:

前端第一个请求服务端,服务端把token返回给客户端(可以直接返回、放在响应头返回、或者放在cookie中),前端将token解析出来,之后的请求,前端直接将token放到请求头或者url请求地址后面来请求系统的服务。

单点登录流程详解

下面对上图简要描述:

用户访问系统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认证中心就类似一个中转站,我们可以看到,分布式系统的管理都是通过一个统一的服务来进行管理的,正所谓合久必分,分久必合;集中式管理,分布式干活。

标签: #用户登录的英文是什么 #前端把token加到请求头