业务系统的管理后台往往数量众多,且各自需要一套用户名密码来进行登录,不方便使用。因此花了点时间研究如何实现一套单点登录系统。
众所周知,SSO系统设计中,往往需要想办法解决cookie不能跨域的问题,因此本系统要求各个需要接入SSO的业务系统,也进行cookie写入。整体工作流程如下:
实际上在实现的时候,为了代码逻辑更加清晰易于维护,SSO本身做了前后端分离。
该项目基于springboot,前端使用了vue,后端端口9999,前端端口8080
https://github.com/scaventz/x-sso
如果你对该项目感兴趣,并且进行了clone,为了能跑起来,你需要做如下工作:
- 在host文件中配置 127.0.0.1 sso.bot.com,127.0.0.1 alert.bot.com
- 在localhost安装并启动redis,端口保持默认6379
- 项目根路径下的doc文件夹下,有mysql的建表语句
- 为了前端能跑起来,需要在sso-front-vue 目录下执行 npm install 安装相关依赖,然后再执行 npm run serve 进行启动,启动后访问 sso.bot.com:8080 即可
也做了一个用于模拟业务系统的demo,地址如下,访问端口为8888,该项目跑起来后,访问项目根路径会看到两个登录按钮,一个普通的登录,和一个用于跳转到SSO登录的按钮,由于demo的目的是测试SSO能否正常工作,因此demo中未对普通登录进行实现
https://github.com/scaventz/x-sso-client-demo
要完成一套堪用的SSO,还有许多需要做的工作是本项目没有完成的,比如以下两个非常重要的点
- 简单的系统接入方式,比如对Spring技术栈的客户端可以考虑直接提供依赖包
- 针对不同的客户端系统,只有前端的,只有后端的,前后端都有的,安全性要求高的,安全性要求不高的,提供不同的接入方式。本项目目前只演示了SSO返回token直接跳转的方式,安全性不高,实际上更安全的方式,为SSO验密成功,生成授权码,跳转会业务系统前端,业务系统前端将授权码给到业务系统后端,其后端再通过这个授权码拿到真正的token。这中间当然还需要考虑,是否为了安全性,需要引入非对称加密算法来进一步保证token的安全性。