如何实现单点登录功能

        在我们日常开发工作中,会遇到这样的功能要求:例如会有多个平台,每登陆其中一个平台就会要求输入一次账号和密码。这样很麻烦,所以就要求如何只需输入一个平台上的账号密码,登陆后再进入其他平台不用再次输入账号密码也能自动登陆。这也就是单点登陆的通俗描述。

一、单点登录

        概念:单点登录全称 Single Sign On(以下简称SSO),是指在多系统应用群中登录一个系统,便可在其他所有系统中得到授权而无需再次登录,包括单点登录与单点注销两部分。(百度百科:单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。)

二、实现单点登陆的三种方式

1.通过Cookie存储用户凭证

        最简单的单点登录实现方式,是使用cookie作为媒介,存放用户凭证。用户登录父应用之后,应用返回一个加密的cookie,当用户访问子应用的时候,携带上这个cookie,授权应用解密cookie并进行校验,校验通过则登录当前用户。不难发现以上方式把信任存储在客户端的Cookie中,这种方式很容易令人质疑:一是Cookie不安全;二是不能跨域实现免登陆。

        对于第一个问题,通过加密Cookie可以保证安全性,当然这是在源代码不泄露的前提下。如果Cookie的加密算法泄露,攻击者通过伪造Cookie则可以伪造特定用户身份,这是很危险的。第二个问题就需要你的所有平台都是在同一个域名下,那么可以使用同域名共享cookie的方式来完成单点登录的信息共享。将web应用群中所有子系统的域名统一在一个顶级域名下,例如“*.baidu.com”,然后将它们的cookie域设置为“baidu.com”,这种做法理论上是可以的,甚至早期很多多系统登录就采用这种同域名共享cookie的方式。

        然而,可行并不代表好,共享 cookie 的方式存在众多局限。首先,应用群域名得统一;其次,应用群各系统使用的技术(至少是web服务器)要相同,不然cookie的key值(tomcat为JSESSIONID)不同,无法维持会话,共享cookie的方式是无法实现跨语言技术平台登录的,比如java、php、.net系统之间;第三,cookie本身不安全。

2.SSO认证授权登录

        上一种方法有很大的局限性,如果跨域名,就实现不了,这里我们可以借助第三方授权来实现。要实现多个平台单点登录,前提是多个平台必须要有一个唯一的账号,如手机号,邮箱,或用户名,这样才可以判断出是哪个用户。

        SSO认证授权登录的具体实现思路是这样的:假如公司有两个不同域名或IP下的管理网站,a.com,b.com,我们想要输入用户名和密码登录a.com, 即可自动登录b.com,怎么实现呢?

        登录a.com后会在a平台产生会话信息,如果我们登录b.com,怎么判断该用户已经登录a平台了,然后自己登录?这里我们需要借助第三方平台来做授权验证,即c.com,该授权中心维护一套共有的账号和密码,当用户访问 a.com 后,我们会跳转到 c.com,并带上a.com 这个来源访问地址,在c.com 中判断是否有登录,如果未登录,则给出登录界面,登录成功后,则产生会话信息,同时生成一个授权Token,保存在c.com cookie 中,然后返回给原地址,如果已经登录(即已经授权过了),则拿到cookie中保存的Token信息然后回跳到原来的访问地址,a.com 判断有Token信息,则拿着这个Token发送http请求到c.com,判断该Token是否有效,如果有效,则返回给用户信息,然后a.com拿到信息后,自动登录a.com。

        当访问 b.com 时,也会去 c.com 中判断是否已经授权过了,因为a.com 已经授过权了,则会给b.com 返回授权Token,然后b.com 判断该Token是否有效,如果有效,则会返回给用户信息,b.com 自动登录,这就是单点登录的一个简单的流程。

3.通过重定向实现

         最后一种介绍的方式,是通过父应用和子应用来回重定向中进行通信,实现信息的安全传递。父应用提供一个GET方式的登录接口,用户通过子应用重定向连接的方式访问这个接口,如果用户还没有登录,则返回一个的登录页面,用户输入账号密码进行登录。如果用户已经登录了,则生成加密的Token,并且重定向到子应用提供的验证Token的接口,通过解密和校验之后,子应用登录当前用户。

猜你喜欢

转载自blog.csdn.net/zhihua_w/article/details/79541506
今日推荐