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