一、简介
1 什么是单点登录?
单点登录(Single Sign On,简称SSO)是一种身份认证机制,允许用户在访问多个相关但独立的软件系统时,只需进行一次登录即可无缝访问所有系统,这大大提高了用户体验,并简化了管理和维护的复杂性,当用户在淘宝登录后,再去天猫就不需要再次输入用户名和密码,这就是典型的单点登录应用。
2 为什么需要单点登录?
在大型网站中,如阿里巴巴旗下的淘宝、天猫、支付宝等,用户一次操作或交易可能涉及多个子系统的协作,如果每个子系统都需要用户认证,不仅用户体验不佳,各子系统的重复认证逻辑也会增加开发和维护难度,单点登录要解决的就是用户只需登录一次就可以访问所有相互信任的应用系统。
二、单点登录的来源
1 早期的单机部署
早期开发的Web应用通常将所有功能打包成一个WAR文件,放入Tomcat容器中运行,这种单体应用虽然简单,但随着业务复杂度的增加,扩展和维护变得困难。
2 分布式集群部署
为了应对高访问量,后来引入了分布式集群部署,一个应用可能会重新部署在多台Tomcat服务器上,通过Nginx实现反向代理,Session无法在这些服务器间共享,用户信息会丢失,这就引出了单点登录的需求。
三、单点登录的原理和实现
1 单点登录的原理
单点登录的核心是解决如何产生和存储信任,以及如何验证这个信任的有效性,就是如何在多个系统之间共享用户的登录状态。
2 实现方案
3.2.1 Cookies + Redis实现
用户登录后,将信息存储到Redis中,其中key为用户ID,value为用户信息数据,然后将Redis中生成的key存储在浏览器的Cookie中,用户每次访问会附带Cookie信息,我们可以在Cookie中拿到key,通过这个key在Redis中取得用户数据即可判断是否登录。
步骤 | 描述 |
1 | 用户在Service 1中登录,生成用户信息并存储到Redis中 |
2 | 在浏览器Cookie中存储对应的Redis key |
3 | 用户访问Service 2时,携带Cookie中的key |
4 | Service 2通过key从Redis中获取用户信息,验证登录状态 |
3.2.2 使用Token实现
用户登录后,为用户生成一个附带用户信息的特殊字符串(称为Token),生成后返回给用户(可以通过Cookie或者地址栏),用户再去访问其他服务时,只需要附带上这个Token即可,服务端对Token继续解析,获取用户信息。
步骤 | 描述 |
1 | 用户在认证中心登录,生成Token并返回 |
2 | 用户访问其他服务时,携带Token |
3 | 服务端解析Token,验证用户信息 |
四、跨域单点登录的实现
1 场景说明
假设有两个子系统A和B,分别在不同的域名下:www.a.com和www.b.com,CAS系统负责中央认证,域名为www.cas.com。
2 跨域单点登录的实现逻辑
4.2.1 初次登录流程
1、用户访问子系统A,未登录状态下被重定向到CAS系统登录页。
2、用户在CAS系统输入用户名和密码,登录成功后生成全局票据(Ticket)并存储在CAS系统的Cookie中。
3、CAS系统生成临时票据(Temp Ticket),并将其存储在Redis中。
4、CAS系统将临时票据返回给用户,用户带着临时票据回到子系统A。
5、子系统A拿着临时票据去CAS系统验证,验证通过后CAS系统返回全局票据。
6、子系统A将全局票据存储在自己的Cookie中,完成登录过程。
4.2.2 再次登录流程
1、用户访问子系统B,未登录状态下被重定向到CAS系统。
2、CAS系统发现用户已登录,生成新的临时票据返回给用户。
3、用户带着临时票据访问子系统B,子系统B拿着临时票据去CAS系统验证。
4、验证通过后,CAS系统返回全局票据,子系统B存储全局票据到自己的Cookie中,完成登录过程。
五、归纳
单点登录(SSO)在分布式系统中扮演着至关重要的角色,它不仅提高了用户体验,还简化了系统的管理和安全维护,通过使用Cookies、Redis、Token等技术手段,可以实现高效、安全的单点登录机制,无论是同域还是跨域的单点登录,都可以通过合理的架构设计和实现来满足需求。
六、相关问题与解答
1 什么是Token及其作用?
答:Token是一种用于身份验证的特殊字符串,包含用户信息,用户登录后,系统生成Token并返回给用户,用户访问其他服务时带上Token,服务端通过解析Token来验证用户身份,Token的作用在于简化认证流程,提高安全性。
6.2 如何解决跨域单点登录中的Cookie无法共享问题?
答:跨域单点登录中,不同域名下的子系统无法共享Cookie,解决方案是通过中央认证服务(如CAS),将用户的登录状态和票据存储在中央服务的Cookie中,各子系统通过与中央服务交互来验证用户身份,从而实现跨域单点登录。
小伙伴们,上文介绍了“分布式系统中的单点登录”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/667253.html