背景
已有用java自研的统一身份认证平台。完成的功能有登录校验,用户信息存储,权限角色系统管理。
需求
有运维提出需要兼容cas+ldap单点登录。
实际
这篇文章可能旨在帮助理解ldap和cas以及他们的使用流程。因为经过了解和设计,发现违背了我们的初衷,所以并未真实使用。但是博主毕竟这么辛苦的学习和设计,还是记录一下。
单点登录和登出
单点登录(Single Sign On),简称为 SSO,是比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
同时还需要单点登出,这样才是一个完整的单点闭环。
ldap单点登录兼容设计
ldap简介
LDAP(Light Directory Access Portocol),它是基于X.500标准的轻量级目录访问协议。
树形存储用户信息,需要服务器存储数据。
存储的最小单位是名目即dn:由多个节点名组成,类似于mysql的primaryKey。
优势:ldap查询速度更快
ldap≠sso
ldap不能实现单点登录。但是可以多个系统分别集成ldap,也就是我们自研的身份认证平台实现的功能,密码明文校验存在安全隐患。
ldap用户登录验证流程(二次验证)
- 用户提交账号/密码到业务系统
- 业务系统访问统一身份认证平台
- 统一身份认证平台用内置的默认用户和密码去ldap数据库查询,有关用户名的信息
- ldap返回结果是否存在,不存在或多条报错,存在取出这条信息
- 再用账号和salt加密之后的用户密码去登录,是否成功。
为什么需要二次验证?
LDAP服务器对于password属性默认都是不可读的。而且存储明文。继承现有的uac加密方式存储为加密之后的明文。
第一次绑定是去搜索,直接输入dn太过冗长。
ldap兼容前后对比
兼容前后对比 | 用户校验 | 信息同步对象 | 同步场景 |
---|---|---|---|
兼容ldap之前 | 加密之后的字段对比 | mysql,activemq | 用户新增,删除,修改,修改密码 |
兼容ldap之后 | 加密之后的字段作为密码登录ldap | mysql,activemq,ldap | 用户新增,删除,修改密码 |
ldap存储设计
dn:uid={用户id|用户账号|用户手机号|用户邮箱},ou={租户编码|租户id},o=c503,o=com
对象:不确定是否可以自己新建,还是使用现成的。使用现成的也可以满足要求。
存储的字段:id,account,password,salt,mobile,mail。这些是必须要有的信息,其中mail可以为空.也可以全量存入。但是没必要。只是单点登录验证而已。
ldap服务部署
可以考虑部署openldap,它主要包括下述4个部分:
- slapd - 独立LDAP守护服务
- slurpd-独立的LDAP更新复制守护服务(用户数据庞大时,为了缓解并发压力可以使用主从ldap)
- 实现LDAP协议的库(用户数据存储的地方)
- 工具软件和示例客户端
参考资料:
【1】Spring Boot 整合 LDAP 开发教程
【2】LDAP概念和原理介绍
【3】比较靠谱的ldap文档
【4】Spring LDAP Reference
【5】openldap
【6】基于LDAP进行验证-方法和问题