企业CAS单点登录的架构思路

公司内开发了很多系统,也部署使用了一些开源系统,每个系统都有自己的账号体系,很容易出现同一个人在A系统叫做xiaoming,在B系统叫做xiaoming1。

随着企业发展,账号、权限管理混乱的问题暴露了出来,需要为每位员工统一账号,才能进一步管理权限,增加审计。

整体思路

  • 使用openldap统一账号密码存储,相当于一个账号密码数据库,但是遵循LDAP标准协议,几乎所有的知名开源项目都支持基于LDAP的用户登录认证。
  • 使用cas作为单点登录(single sign-on)服务,以openldap作为认证数据库。

对于仅支持ldap协议的开源项目,直接对接openldap数据库完成账号密码认证即可。

对于支持cas协议的开源项目,对接cas服务完成单点登录认证。

原理说明

openldap

因为原本各个系统有自己的账号数据库,所以首先要做的是统一账号存储。

openladp采用树状存储管理数据,常用于管理组织架构,例如:

配置与使用openldap需要掌握一些相关概念,也有GUI工具可视化操作ldap数据库,例如:http://www.ldapadmin.org/

cas

cas是一个开源项目,同时也是一种单点登录协议,但是cas项目不只支持cas协议,下面先说一下cas项目的架构。

整个CAS Server由3部分构成:

  • Web (Spring MVC/Spring Webflow):cas服务的逻辑部分,包括提供了登录、注册等功能页面。
  • Ticketing:票据管理,用户通过web登录后获取的登录票据管理。
  • Authentication:管理账号密码,与openldap对接。

流程很简单,用户访问A应用,A应用无本地会话,则重定向用户去cas Web登录,并与cas之间的生成登录会话;cas重定向用户回A应用(URL中携带票据ST),A应用后台拿ST调用cas web获取用户信息(ST立即失效)并立即创建A本地登录会话:

这里面有两个名词,都非常简单:

  • TGT:一旦用户在cas登录,那么cas在后端就维护了登录session;一旦有了cas session,那么用户访问其他应用被再次跳转cas时候就已经是登录状态,用户不必重新向cas重复输入账号密码。
  • ST:一次性的票据,cas server重定向用户回到应用时携带在URL中,这样应用可以拿着ST访问cas获取用户信息,注意获取一次ST就失效了。

cas协议要求应用自己维护本地登录会话,整个协议时序图如下:

cas with oauth

之前说过,cas是一个项目也是一个协议名。

cas项目是一个单点登录服务,内部支持多种协议,cas协议是其发明的一种单点登录协议(流程),其他支持的协议如下:

其中OpenID和Oauth2.0也是耳熟能详的一些单点登录协议,尤其Oauth2.0是各大互联网公司普遍支持的协议,用于第三方应用的统一登录,例如:微博、百度、QQ、微信。

这些协议与CAS协议是并行的关系,使用cas项目可以选择搭建CAS协议或者Oauth协议,这就是它们的关系。

协议之间存在流程和功能的差别,比如Oauth除了支持单点登录外还支持应用授权,比如一个第三方应用想要访问用户的生日信息,那么就需要用户在单点登录后给应用进行授权,这样第三方应用才能访问cas server拿到用户的生日。(cas协议就没有授权功能)

cas配置Oauth2.0:https://apereo.github.io/cas/5.1.x/installation/OAuth-OpenId-Authentication.html;整体协议流程参考《理解Oauth2.0 — 阮一峰》,借用流程图如下:

与cas相比,Oauth对应用(Client)来说多了一个access token,可以重复使用access token去获取用户信息,这与cas的ST一次性生命期设计是不同的。最重要的是,Oauth增加了授权环节,即应用(Client)可以申请访问用户的某些信息,需要用户在cas端进行授予,随后应用可以持access token访问相关信息。

客户端

cas项目支持多语言客户端,绝大多数都是只实现了cas协议(不支持oauth2.0协议),使用起来特别方便,大家自己学习吧:https://apereo.github.io/cas/4.2.x/integration/CAS-Clients.html

按照我的观察,cas客户端均已将应用登录会话管理封装在里面了,比如PHP会自动将应用登录会话状态保存在$_SESSION中。

最后

理解概念与流程是第一步,第二步就是配置openldap与cas项目,这个过程可能比较痛苦,我并没有实践过。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~