单点登录的主要是应用在分布式架构的场景中,在之前传统的一站式架构中,我们解决用户信息共享的方案就是在用户登录之后将用户的信息加入到session中,只要在一个会话的过程中用户的信息都可以从服务器端直接获取,避免重复要求用户登录的过程。
相比之下,分布式架构中我们会把不同的模块分布在不同的服务器中,那不同的服务器之间的session是不一样的, 如果继续延用一站式用户信息共享的方案很显然没有办法满足我们的需求,所以我们采用了目前主流的单点登录方案,那具体的实现我们一共想了2种解决方案:
第一:使用Redis模拟session进行数据的共享
执行流程:
文字说明:
- 用户在其他界面触发跳转登录界面的请求,输入完成正确的用户名以及密码之后,将用户信息以字符串的方式保存在redis中,用UUID作为Redis的key值。
- 将Redis的key值作为cookie的value值进行存储,给这条cookie起个名字,随便叫,可以叫ticket,也可以叫token。
- 当用户切换到其他模块界面时,触发登录校验时,会先根据之前约定好的名字,ticket或者token,从cookie中获取对应的值,如果拿到了对应的值就说明用户已经登录,如果没有获取到值说明用户没有登录,将用户请求踢到登录界面。
- 根据cookie中取到的value值到Redis中去查询用户信息是否过期,如果过期,则同样将用户请求踢到登录界面,如果没有过期,就将查询到的用户信息返回。
第二:使用CAS单点登录系统
执行流程:
文字说明:
- 用户在其他界面触发跳转登录界面的请求,重定向到CAS的认证系统
- 用户输入用户名以及密码
- CAS系统判断用户名密码是否正确,如果正确返回票据ticket给用户
- 用户在访问其他系统时会带着ticket去访问
- 系统会拿ticket到CAS认证系统中进行校验
- 如果校验成功成功,将用户名返回给系统