虽然这个不是面经里经常出现的。好在基本概念比较明了,理解起来也不太费力,所以准备java面试的时候可以顺便看一下。
源码即正义
看了源码才发现作者是大名鼎鼎的WXG!好激动
简介
sso系统是单点登录系统,避免同一个用户多次登陆不同系统。在多个应用系统中,只需要登录一次,就可以访问其他相互信任的应用系统。
这个系统仔我研究生学校就有用到,学生登录系统就是用sso写的。可以看到我们学校sso的登录页面网址是
http://xxx/profile/SAML2/Redirect/SSO?execution=e1s3
在没有sso的情况下,
当登陆一个网页应用时,即使浏览器使用了cookies,但是在不同域中,是不能共享同一个cookie的。这就导致一个用户在多个应用中必须登录多次。
流程
单个登录的一般流程如下(基于 Cookie):
当用户首次访问 A 系统时,系统 A 发现用户未登录,然后重定向到 SSO 身份验证中心,并携带请求 url 执行登录验证。
用户在 SSO 身份验证中心对用户名和密码进行身份验证。登录成功后,服务器生成票证,然后重定向到系统 A 的源 url 并将票证附加到 URL 参数。
系统 A 在网址参数中获取票证,并启动与 SSO 的票证比较。如果比较成功,系统 A 将释放并存储票证到 Cookie 中。
用户访问 B 系统。此时,B 系统已将票证带到域下,并直接向 SSO 启动票证测试。如果测试成功,则执行释放,并将票证存储在 Cookie 中(更新票证到期时间)。
当用户注销时,删除域下的 Cookie。
图片来自https://www.jianshu.com/p/75edcc05acfd
工具:redis
sso-server 使用 redis 存储用户票证,app-a 和 app-b 使用 Spring 拦截器过滤用户请求,如果验证失败,每个请求都需要验证索服务器的票证重新定向登录(带源 url)。