公司内开发了很多系统,也部署使用了一些开源系统,每个系统都有自己的账号体系,很容易出现同一个人在A系统叫做xiaoming,在B系统叫做xiaoming1。
随着企业发展,账号、权限管理混乱的问题暴露了出来,需要为每位员工统一账号,才能进一步管理权限,增加审计。
整体思路
- 使用openldap统一账号密码存储,相当于一个账号密码数据库,但是遵循LDAP标准协议,几乎所有的知名开源项目都支持基于LDAP的用户登录认证。
- 使用cas作为单点登录(single sign-on)服务,以openldap作为认证数据库。
对于仅支持ldap协议的开源项目,直接对接openldap数据库完成账号密码认证即可。
对于支持cas协议的开源项目,对接cas服务完成单点登录认证。
原理说明
openldap
因为原本各个系统有自己的账号数据库,所以首先要做的是统一账号存储。
openladp采用树状存储管理数据,常用于管理组织架构,例如:
1 2 3 4 5 6 7 |
dc: org | dc: genfic ## (Organisation) / \ ou: People servers ## (Organisational Units) / \ .. uid: .. John ## (OU-specific data) |
配置与使用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项目,这个过程可能比较痛苦,我并没有实践过。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~

Pingback引用通告: phpcas的几个遗留问题 | 鱼儿的博客
1