单点登录的目的是为了一次登录,访问所有的应用系统,简单访问流程,同时增强安全性。
根据不同的应用场景,单点登录可以有不同的设计方案:
1. 统计登录入口,使用一套用户,或者各个系统的用户通过数据交换保持一致,访问任何一个系统,都会跳转到统一的登录入口进行登录。
2. 可以通过统一的入口登录,也可以单独登录某个子系统,通过统一入口登录,则可以访问所有系统,通过子系统单独登录,则只能访问子系统。这种适合于有很多遗留系统,或者使用不同服务商的系统,很难整合的情况。
如果能使用一套用户自然是最好的方案,但是这也面临一个问题,各个子系统的权限管理如何做?所以现实中这也不太可能,各个子系统通常都会有自己的用户表,因此我们必然需要一套方法来使得各个系统的用户保持统一。这自然就会要有一些约束条件,比如只能在门户中增删用户,然后通过一定的同步机制同步到各个子系统。
单点登录的实现可以考虑使用开源的软件,比如cas,也可以自己实现
cas默认是统一登录入口,所有子系统访问的时候如果没有登录就会跳转到cas的登录页,如果不想使用统一的登录页,则可以在子系统中让cas只拦截某一个请求,只有访问这个请求的时候才会去cas验证用户信息,在门户中配置这个请求则可实现单点登录,单独访问子系统的时候就不受cas的影响。
自己实现也不是很难,下面是一个简单的流程
1. 用户提供用户名密码登录
2. 跳转到单点登录系统(SSO)中完成登录
3. 写cookie到各个子系统的域中
4. 跳转回到登录后的页面,完成登录
5. 访问其它子系统
6. 去SSO中查询是否登录
7. SSO检查cookie信息,如果已登录则发放一个token
8. 子系统拿到token再次请求SSO,完成二次握手,SSO返回用户名
9. 子系统通过用户名去查询到完整的用户信息,完成登录。
单点登录是否一定要使用LDAP呢?我觉得不一定,这要看具体的情况而定,LDAP的优势是跨平台,读取速度快,分布式,成本低,所以用来管理用户信息是很好的。不过使用LDAP也有一定的学习成本,对于习惯了关系数据的朋友来说,也要花一定的时间来学习和使用,所以如果你的项目紧急的话,直接使用关系数据库也是可以的,以后再按需求来确定是否要转成LDAP都可以。
CAS本身对各种数据库都提供支持。