1

1、什么是SSO系统?

单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。

2、SSO系统实现原理?

这里用一张图说明sso流程
sso.png

3、SSO系统实现?

假设zss系统前端域名为zsstest.zuel.com:8081,后端域名为zsstest.zuel.com:8887;sso系统前端域名为sso.zuel.com:8082,后端域名为sso.zuel.com:8888。我们跟着原理流程图来讲解如何实现单点登录。

假设zss系统首页zsstest.zuel.com:8081/index有一个/api/getUserinfo请求获取用户信息,当第一次用浏览器打开首页时就发送了该请求,zss-os后端接收到该请求,发现请求没有携带cookie身份(也就是token),返回401zss-fe前端,前端响应拦截器拦截到返回数据,发现返回数据为401,于是重定向到sso的登录页(sso.zuel.com:8082/login),并把zss系统首页作为参数拼接到重定向地址的后面(window.location.href=http://sso.zuel.com:8082/login?service=http://zsstest.zuel.com:8081/index)。当登录成功时,sso-os后端根据账户和时间生成token(使用jwt包),通过设置响应头Set-Cookie属性种下cookie,并把token存到redis集群中,最后重定向到service参数url

重定向到service参数url又会再次发送/api/getUserinfo请求,后端zss-os就会去校验cookie身份(redis集群中去找是否有该身份的token存在),若校验合法,则返回请求结果,否则返回401又再次重定向到sso登录页。

这里使用redis集群的目的是zss系统和sso系统都可以访问到redis存储的数据。

上面还有许多坑,在设置cookie时需要注意:

  • 当前端配置withCredentials=true时, 后端配置Access-Control-Allow-Origin不能为*, 必须是相应地址
  • 当配置withCredentials=true时, 后端需配置Access-Control-Allow-Credentials
  • 当前端配置请求头时, 后端需要配置Access-Control-Allow-Headers为对应的请求头集合
  • 后端设置的set-cookie若想在浏览器cookie中显示并且在前端请求头自动携带,那么设置cookiedomian就必须与前端当前页域名、请求域名一样。比如,上述domain设置为.zuel.com,那么zsstest.zuel.com:8081/index页面的cookie将会显示,zsstest.zuel.com:8887/api/getUserInfo请求头也会自动携带domain域名的cookie
  • 只有name、path、domain相同的cookie才是同一个cookie

参考:
https://juejin.im/post/5c2490...
https://juejin.im/post/5c0f2a...
https://juejin.im/post/59d1f5...

单点登录的实现:
上面生成token使用了时间,也就是每次登录成功生成的token都会不同,当用户A使用chrome登入系统生成的tokent1redis存储t1,浏览器cookie存储t1,然后用户A换个Firefox登录,生成tokent2redis存储t2,浏览器cookie存储t2。当用户Achrome刷新页面,请求携带的cookie还是t1,但redis存储的cookie已经变成t2,所以身份验证不会通过,页面会重定向到sso登录页

统一登陆实现效果:
sso (1).gif

项目git地址


记得要微笑
1.9k 声望4.5k 粉丝

知不足而奋进,望远山而前行,卯足劲,不减热爱。