核心思路:用Redis管理全局令牌
要实现单点登录,关键是找到一个能让多个不同应用都能识别和验证用户身份的共同方法。传统的做法是让每个应用自己管理登录状态,但这样用户在每个应用都得登录一次。单点登录的理念是“一次登录,处处通行”。Redis作为内存数据库,读写速度极快,非常适合担任存储全局登录状态的“中央仓库”角色。根据《Redis实战》等资料,其高性能特性很适合存储会话、令牌这类需要频繁读写的数据。
具体实现步骤
当用户第一次访问系统A(我们称之为认证中心或SSO服务器)时,需要进行登录。用户输入用户名和密码验证成功后,系统会生成一个全局唯一的字符串,这就是“全局会话令牌”,比如一个很长的随机码。同时,系统还会生成一个或一组“临时票据”,用于访问其他具体应用。系统会立刻把这个全局令牌以及相关的用户信息(比如用户ID、登录时间)作为键值对,存储到Redis中,并设置一个合理的过期时间,比如2小时。

之后,系统A会把这个全局令牌通过Cookie或URL参数等方式“种”在用户的浏览器里。当用户去访问另一个应用B时,应用B会发现用户没有自己的本地登录状态,但检测到用户携带了这个全局令牌。于是,应用B就拿着这个令牌,直接去问Redis:“这个令牌有效吗?对应的用户是谁?”Redis会快速查找并返回结果。如果令牌有效,应用B就认为用户已经登录,并为其创建自己应用的本地会话,这个过程对用户是完全无感的。票张的说法在《单点登录原理与简单实现》等网络技术文章中有提及。
解决状态同步与退出问题
单点登录的一个大难题是退出登录。用户在应用A点击了“退出”,如何保证他访问应用B时也是退出状态呢?借助Redis就很简单。因为所有应用的登录验证都依赖于Redis里存储的那个全局令牌。当用户在任何一个地方退出时,SSO服务器只需要做一件事:到Redis里把存储的这个全局令牌对应的键值对删除掉。这样一来,这个令牌就立刻失效了。之后,无论用户再拿着这个旧令牌去访问哪个应用,应用向Redis查询时都会得到“令牌不存在或已失效”的结果,从而都会要求用户重新登录。这就完美解决了多应用间登录状态同步登出的问题。这种集中式管理的思路在很多互联网公司的实践中都有应用。

优势与需要留意的点
使用Redis来实现单点登录的主要好处是速度快、架构清晰。所有状态集中管理,易于维护和监控。但也需要注意几个方面。一是Redis的高可用性,因为一旦Redis服务宕机,所有应用的登录校验都会失败,所以通常需要考虑Redis的主从复制或集群部署,确保服务不中断。二是安全性,存储在Redis里的令牌和用户信息需要谨慎处理,防止泄露。三是网络性能,虽然Redis很快,但如果应用服务器和Redis服务器之间的网络延迟很高,也会影响登录体验,所以网络架构也需要优化。这些都是在实际部署时需要综合考虑的。