单点登录系统SSO实现
前些天被问到单点登录了,而据我当时做的这个模块两年了,现在重新温习并记录下,方便以后快速回忆起来
一、什么是单点登录系统
SSO全称Single Sign On。SSO是用户只需要登录一次就可以访问所有相互信任的应用系统
二、为什么需要单点登录系统
分布式集群的项目因为每个模块都部署在不同的机器。如果第一次在A系统登录,第二次访问B系统,这个时候B系统并没有保存用户状态,或者第一次nginx转发到A系统的机器1,在机器1登录,第二次访问A系统,nginx转发到了机器2,这些情况下都是需要重新登录。
为了解决这种情况,可以有两种机制:单点登录、tomcat配置session复制
session复制在集群下,代价过高,可能导致系统资源消耗过多。
所以构建一个单点登录系统,提供一个接口,供其他模块调用,来检测用户登录状态。实现就是使用redsi来模拟session,对session统一管理
三、怎么实现
1、首先sso系统提供登录,校验用户,登出等基本用户操作
2、登录的时候将用户信息保存到redis中,并设置过期时间,(key可以含有token,value为用户信息),请将用户的token响应给浏览器cookie,并设置cookie的domain(domain用来设置域,方便子域名系统能把cookie携带过来)
3、登录校验:最好写成一个过滤器,用户每次请求当前domain设置的域名及其子域名的时候,会携带用户cookie,过滤器从cookie里取token,去redis里查询用户信息,查到就放行,未查到就跳转到登录页面
4、登出:用户发起登出请求,登出接口获取到cookie中的用户的token,然后进行缓存请求,并清空cookie
参考链接:https://www.jianshu.com/p/cf41a10da952
心里有束光,眼里有片海