本文主要讲解单点登录集成到我们的电商项目,没有使用CAS
框架,使用的是国产XXL-SSO
框架,其原理大同小异,不影响思路。
阅读本文之前用一句话来概括单点登录的作用:
“单点登录主要解决多个系统,统一登录”
在企业发展初期,企业使用的系统很少,通常一个或者两个,每个系统都有自己的登录模块,运营人员每天用自己的账号登录,很方便。
但随着企业的发展,用到的系统随之增多,运营人员在操作不同的系统时,需要多次登录,而且每个系统的账号都不一样,这对于运营人员来说,很不方便。于是,就想到是不是可以在一个系统登录,其他系统就不用登录了呢?这就是单点登录要解决的问题。
单点登录英文全称Single Sign On
,简称就是SSO
。它的解释是:在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。
如图所示,图中有4个系统,分别是Application1、Application2、Application3、和SSO。Application1、Application2、Application3没有登录模块,而SSO只有登录模块,没有其他的业务模块,当Application1、Application2、Application3需要登录时,将跳到SSO系统,SSO系统完成登录,其他的应用系统也就随之登录了。这完全符合我们对单点登录(SSO)的定义。
我们先登录XXL-SSO官网:https://www.xuxueli.com/xxl-sso/
从上图可以看到XXL-SSO分布式单点登录框架有如下特性:
这些特性中,按功能分,我觉得主要是第三点“Cookie+Token均支持”,那这两种形式又是如何的呢?下文将详细描述。
学习单点登录前,必须了解下面几个角色
概念 | 说明 |
---|---|
SSO Server | 中央认证服务,支持集群 |
SSO Client | 接入SSO认证中心的Client应用(也就是我们的业务服务) |
SSO SessionId | 登录用户会话ID,SSO 登录成功为用户自动分配 |
SSO User | 登录用户信息,与 SSO SessionId 相对应 |
那Cookie形式如何实现单点登录的呢?官网的图是这样的:
登录流程:
很多的人会问,第5步中,对“SSO Server已经登录,所以直接redirect,走2、3、4步”这一句话不是很理解,那如果换了浏览器,为什么就不能直接登录呢?
其实我曾经也有过这个疑问,其实不要忘记了还有第3步骤,SSO Server
登录成功后,也会把SessoinId
放入浏览器的Cookie
中的,也就是放到SSO Server
域名下的Cookie
中,而新的浏览器中,SSO Server
域名下Cookie
没有登录成功返回的SessionId
,所以SSO Server
就判断该Client没有登录了。
登出流程又是如何的呢?
用户与Client端应用请求注销Path时,将会 redirect
到 SSO Server
自动销毁全局 SSO SessionId
,实现全局销毁。
然后,访问接入SSO保护的任意Client端应用时,SSO Filter
均会拦截请求并 redirect
到 SSO Server
的统一登录界面。
首先我们从Github
克隆XXL-SSO
的源码到本地(https://github.com/xuxueli/xxl-sso.git
):
下载完源码,我们可以看到目录结构如下:
打开xxl-sso-server
目录,可以看到有如下结构:
他们分别表示:
打开xxl-sso-server的配置文件,可以看到需要配置Redis地址,在这里配置好Redis地址:
启动xxl-sso-server
日志文件的位置!
可以看到启动成功:
SSO
认证中心已经配置好并打开了,下面我们来看看SSO Client端。
打开samples下的xxl-sso-web-sample-springboot
项目,并配置redis
路径(与认证中心的一致):
在上图可以看到xxl.sso.server
对应的值为:http://xxlssoserver.com:8080/xxl-sso-server
,这里用到了域名,所以要在我们本地localhost
文件里配置域名
启动成功:
浏览器输入:http://xxlssoclient1.com:8081/xxl-sso-web-sample-springboot
可以看到自动跳转到了SSO
认证服务中心的登录页面了,url地址变为如下,可以看到携带了一个redirect_url,指的就是登录成功后重定向的地址:
http://xxlssoserver.com:8080/xxl-sso-server/login?redirect_url=http://xxlssoclient1.com:8081/xxl-sso-web-sample-springboot/
为了更好的验证单点登录,我们复制xxl-sso-web-sample-springboot
项目命名为xxl-sso-web-sample-springboot8083
,并设置端口号为8083
:
并在hosts文件增加配置:
启动复制的项目
好了,可以开始验证了。首先浏览器输入Client1服务地址:http://xxlssoclient1.com:8081/xxl-sso-web-sample-springboot
,会自动跳转到授权中心:
点击登录,可看到登录成功,而且登录成功后的sessionid在地址栏也能看到。
接下来看看Client2是否需要再次登录,浏览器输入:http://xxlssoclient2.com:8083/xxl-sso-web-sample-springboot
可以看到Client2也登录成功了,而且sessionid与Client1的一样。
最后,我们看看浏览器的Cookie信息,观察发现他们的sessionid也是一致的:
clinent1
client2
打开Redis可视化窗口,可以看到Redis服务器有保存SessionId:
其实基于Token
的形式去单点登录与基于Cookie
形式大同小异的。相对于Cookie
的形式,只是少了个跳转登录界面。根据xxl-sso的官方文档,直接使用PostMan来演示。
首先演示登录(url:http://xxlssoserver.com:8080/xxl-sso-server/app/login?username=user&password=123456
)
可以是直接访问了SSO Server
的登录接口,返回的data
就是sessoinid
了,其它客户端可以使用这个sessionid来实现单点登录。
启动xxl-sso-token-sample-springboot
项目(端口号8082):
postman请求,注意sessionid放到请求头:
登录成功!
本文主要讲解了单点登录的相关概念,已经使用xxl-sso框架来做演示。