市场上一下主流的SSO技术搭配方案:css
本篇主要是单点登陆,不涉及鉴权,后面文章会再补充java
xxl-sso 是一个国产 SSO 框架,基于 cookies 实现,也许你会考虑跨域问题,虽然 cookies 自己不跨域,但能够利用它实现跨域的 SSO。git
gitee地址:https://gitee.com/xuxueli0323/xxl-sso
github地址:https://github.com/xuxueli/xxl-ssogithub
JDK:1.7+
Redis:4.0+web
127.0.0.1 xxlssoserver.com
127.0.0.1 xxlssoclient1.com
127.0.0.1 xxlssoclient2.com
修改 application.properties redis为本地地址后启动 xxl-sso-server:redis
### xxl-sso
xxl.sso.redis.address=redis://127.0.0.1:6378
xxl.sso.redis.expire.minite=1440
完美报错,若是你跟我上图同样,那么说明你的 redis 设置了密码,这个官方示例代码是没有配置 redis 密码的,看控制台:spring
咱们能够看到初始化时用到了 redis 的本地地址,那么只须要知道在哪用了这个地址,那么确定就会有设置密码的地方。后端
果不其然,咱们最终发现了,地址是经过 JedisShardInfo 这个对象传递进去的,进入这个对象后发现,居然有个 password?这不就是咱们要找的密码吗。跨域
再次启动,成功启动。浏览器
一样的修改 xxl-sso-samples > xxl-sso-web-samples-sprigboot 的 properties 而后再启动。
客户端端口号被我改为8085,认证中心保持默认端口号8080
届时,咱们启动了两个项目,浏览器访问第一个域名:http://xxlssoclient1.com:8085/xxl-sso-web-sample-springboot
咱们能够看到访问后将被重定向到认证中心 http://xxlssoserver.com:8080/xxl-sso-server ,后面携带参数 redirect_url ,其为界面跳转前的连接,认证经过后将再次重定向回原来的访问连接。
上图为认证成功后的图片,会携带 xxl_sso_sessionid,其用于识别用户登录信息,并会保存至本地两份 cookie,皆用来保存 xxl_sso_sessionid ,一份当前域名(xxlssoclient1.com),一份认证中心(xxlssoserver.com)。
保存的两份 xxl_sso_sessionid 值是同样的。
在上图中的认证界面,点击登陆后会调用 WebController > doLogin 方法,用户登陆成功后会生成该用户的 xxl_sso_sessionid 信息,并保存至 redis 中,同时会把 xxl_sso_sessionid 写入客户端 cookie,而后将重定向到 redirect_url,并拼接 xxl_sso_sessionid 参数,以下图所示。
咱们再来访问第二个客户端试试,http://xxlssoclient2.com:8085/xxl-sso-web-sample-springboot,就目前并未向 http://xxlssoclient2.com:8085 写入任何有关 cookie 用户会话信息:
神奇的一幕发生了,显然2号客户端也成功登录了,并携带了跟客户端1同样的 xxl_sso_sessionid 信息,咱们再来看一下 cookie 信息:
其实经过 debug 发现,在 xxlssoclient1.com 登录的前提下,再去访问 xxlssoclient2.com 时,因为没有任何登录信息一样也是首先会跳转至认证中心:
还记得客户端1登录后在认证中心 xxlssoserver.com 一样留下 xxl_sso_sessionid 信息吗?
显然,客户端2号再跳转过来时复用了认证中心的 xxl_sso_sessionid,而后发现存在 xxl_sso_sessionid,且 xxl_sso_sessionid 在 redis 里也没过时,则认为用户已经登录了,从新重定向到 xxlssoclient2.com
看完了统一登陆,再来看一下退出操做。
退出相对就比较简单了,主要就是验证 redis 中的 xxl_sso_sessionid,咱们来看一下退出方法:
首先调用退出方法后会清空当前网站的 cookie、redis 中的 xxl_sso_sessionid,好比在 xxlssoclient1.com、xxlssoclient2.com 都登录的状况下,经过 xxlssoclient2.com 退出当前用户,则首先会清空 xxlssoclient2.com 站点下的 cookie ,同时后台也会清空当前用户的 redis,那么再经过 xxlssoclient1.com 访问时,尽管携带 xxl_sso_sessionid,但此时该信息已通过期,因此会再次重定向认证中心。
如上为 xxl-sso 架构图,其核心为:
sso-server:中央认证服务
sso-client:接入 sso 认证中心的客户端应用
sso-sessionId:登录用户会话ID,SSO 登录成功后为用户自动分配
sso-user:登录用户信息,与 SSO sessionId 相对应
至此,经过 cookie+redis 解决了多端统一认证,全局 sessionId 解决了 session 共享的问题。
若是 Cookie 被禁用怎么办?
xxl-sso 一样提供了 基于 token 接入方式,用于没法使用Cookie的场景使用,如APP、Cookie被禁用等,详细可参考 xxl-sso-token-sample-springboot 项目。
更多信息请访问官方文档:http://www.xuxueli.com/xxl-sso/#/
后面会写一篇实际项目中接入 xxl-sso 框架的实例。
我建立了一个java相关的公众号,用来记录本身的学习之路,感兴趣的小伙伴能够关注一下微信公众号哈:niceyoo