单点登录SSO设计分析
单点登录设计分析
1. 项目概述
MaxKey 是一个开源的身份和访问管理 (IAM) 系统,提供单点登录 (SSO)、多因素认证、权限管理等核心功能。本报告通过分析 MaxKey 的代码结构,提取其设计模型,旨在帮助理解系统的架构设计和实现方式。
2. 代码结构分析
2.1 核心模块
| 模块名称 | 描述 | 主要职责 |
|---|---|---|
| maxkey-commons | 公共模块 | 提供通用工具类、常量定义、核心接口等 |
| maxkey-entity | 实体模块 | 定义系统核心实体类,如用户、应用、角色等 |
| maxkey-authentications | 认证模块 | 实现各种认证方式,如用户名密码、短信、多因素认证等 |
| maxkey-protocols | 协议模块 | 实现各种认证协议,如 OAuth 2.0、SAML 2.0、CAS 等 |
| maxkey-persistence | 持久化模块 | 实现数据访问层,包括数据库操作、缓存等 |
| maxkey-webs | Web 模块 | 实现 Web 界面和 API,包括管理后台、用户登录界面等 |
| maxkey-starter | 启动器模块 | 提供各种功能的启动器,如验证码、短信、社交登录等 |
| maxkey-synchronizers | 同步模块 | 实现用户数据同步,如 LDAP、JDBC 同步等 |
2.2 代码组织
MaxKey 采用模块化的代码组织方式,每个模块负责特定的功能领域,模块之间通过接口进行通信。核心代码主要位于 org.dromara.maxkey 包下,按照功能划分为不同的子包:
org.dromara.maxkey.authn:认证相关代码org.dromara.maxkey.authz:授权相关代码org.dromara.maxkey.entity:实体类定义org.dromara.maxkey.persistence:数据持久化org.dromara.maxkey.web:Web 相关代码org.dromara.maxkey.configuration:配置相关代码org.dromara.maxkey.constants:常量定义
3. 设计模式分析
3.1 抽象工厂模式
应用场景:认证提供者的创建
实现:AuthenticationProviderFactory 类负责创建不同类型的认证提供者,如 NormalAuthenticationProvider、MobileAuthenticationProvider 等。
优势:
- 提供了统一的接口来创建不同类型的认证提供者
- 隐藏了具体实现的细节,便于扩展新的认证方式
3.2 策略模式
应用场景:认证方式的选择
实现:不同的认证提供者实现了 AbstractAuthenticationProvider 抽象类,提供了不同的认证策略。
优势:
- 可以动态选择不同的认证策略
- 便于添加新的认证方式,无需修改现有代码
3.3 模板方法模式
应用场景:认证流程的处理
实现:AbstractAuthenticationProvider 类定义了认证的基本流程,具体的认证提供者实现了 doAuthenticate 方法。
优势:
- 统一了认证流程的结构
- 子类可以专注于实现具体的认证逻辑
3.4 单例模式
应用场景:全局配置和服务
实现:ApplicationConfig、SessionManager 等核心服务采用单例模式。
优势:
- 确保全局只有一个实例,避免资源浪费
- 提供了统一的访问点
3.5 观察者模式
应用场景:会话管理和事件处理
实现:SessionListenerAdapter 类实现了会话事件的监听和处理。
优势:
- 实现了松耦合的事件处理机制
- 便于添加新的事件监听器
3.6 适配器模式
应用场景:不同认证协议的适配
实现:各种协议模块(如 OAuth 2.0、SAML 2.0)实现了相应的适配器。
优势:
- 统一了不同协议的接口
- 便于集成新的认证协议
4. 架构设计
4.1 分层架构
MaxKey 采用经典的分层架构,包括:
- 表现层:Web 界面和 API,负责处理用户请求
- 业务逻辑层:认证、授权、用户管理等核心业务逻辑
- 数据访问层:数据库操作、缓存等
- 基础设施层:通用工具、配置管理等
4.2 核心流程
4.2.1 认证流程
- 请求处理:接收用户认证请求
- 凭证验证:验证用户凭证的合法性
- 用户状态检查:检查用户的状态是否正常
- 密码策略验证:验证密码是否符合策略要求
- 会话创建:创建用户会话
- 权限授予:授予用户相应的权限
- 登录历史记录:记录用户登录历史
4.2.2 授权流程
- 资源访问请求:用户请求访问资源
- 权限检查:检查用户是否有访问该资源的权限
- 授权决策:根据权限检查结果决定是否授权
- 访问控制:执行访问控制,允许或拒绝访问
4.3 模块间依赖
| 模块 | 依赖模块 | 依赖关系 |
|---|---|---|
| maxkey-authentications | maxkey-commons, maxkey-entity, maxkey-persistence | 使用公共模块、实体类和持久化服务 |
| maxkey-protocols | maxkey-commons, maxkey-entity | 使用公共模块和实体类 |
| maxkey-persistence | maxkey-commons, maxkey-entity | 使用公共模块和实体类 |
| maxkey-webs | maxkey-authentications, maxkey-protocols, maxkey-persistence | 使用认证、协议和持久化模块 |
| maxkey-starter | maxkey-commons | 使用公共模块 |
| maxkey-synchronizers | maxkey-commons, maxkey-entity, maxkey-persistence | 使用公共模块、实体类和持久化服务 |
5. 核心实体设计
5.1 UserInfo(用户信息)
主要属性:
- id:用户ID
- username:用户名
- password:密码(加密)
- displayName:显示名称
- email:邮箱
- mobile:手机号码
- authnType:认证类型
- status:用户状态
- department:部门
- organization:组织
- lastLoginTime:最后登录时间
- lastLoginIp:最后登录IP
- isLocked:是否锁定
- badPasswordCount:密码错误次数
- passwordLastSetTime:密码最后设置时间
关系:
- 与 Groups:多对多关系,通过 GroupMember 实体关联
- 与 Apps:多对多关系,通过 UserApps 实体关联
- 与 Organizations:多对一关系
- 与 HistoryLogin:一对多关系
5.2 Apps(应用)
主要属性:
- id:应用ID
- appName:应用名称
- loginUrl:登录URL
- category:应用分类
- protocol:认证协议
- secret:应用密钥
- visible:可见性
- credential:凭证类型
- sharedUsername:共享用户名
- sharedPassword:共享密码
- status:应用状态
关系:
- 与 UserInfo:多对多关系,通过 UserApps 实体关联
- 与 Groups:多对多关系,通过 Access 实体关联
- 与 Roles:多对多关系,通过 PermissionRole 实体关联
5.3 Roles(角色)
主要属性:
- id:角色ID
- roleCode:角色编码
- roleName:角色名称
- category:角色分类
- isdefault:是否默认角色
- status:角色状态
- appId:关联应用ID
关系:
- 与 Groups:多对多关系,通过 RoleMember 实体关联
- 与 Apps:多对多关系,通过 PermissionRole 实体关联
5.4 Groups(用户组)
主要属性:
- id:组ID
- groupCode:组编码
- groupName:组名称
- category:组分类
- isdefault:是否默认组
- status:组状态
关系:
- 与 UserInfo:多对多关系,通过 GroupMember 实体关联
- 与 Apps:多对多关系,通过 Access 实体关联
- 与 Roles:多对多关系,通过 RoleMember 实体关联
5.5 Resources(资源)
主要属性:
- id:资源ID
- resourceName:资源名称
- resourceType:资源类型
- resourceUrl:资源URL
- resourceAction:资源操作
- permission:权限
- appId:关联应用ID
- parentId:父资源ID
- status:资源状态
关系:
- 与 Permission:多对多关系,通过 Permission 实体关联
6. 流程设计
6.1 认证流程
6.2 授权流程
6.3 单点登录流程
7. 规则设计
7.1 认证规则
| 规则名称 | 描述 | 实现方式 |
|---|---|---|
| 认证类型规则 | 定义系统支持的认证方式,包括用户名密码、手机、短信、邮箱、证书等 | UserInfo.AUTHNTYPE 枚举类 |
| 认证流程规则 | 定义用户认证的流程,包括凭证验证、用户状态检查、会话创建等 | AbstractAuthenticationProvider 类 |
| 多因素认证规则 | 定义多因素认证的流程和规则 | MfaAuthenticationProvider 类 |
7.2 密码策略规则
| 规则名称 | 描述 | 实现方式 |
|---|---|---|
| 密码长度规则 | 定义密码的最小和最大长度 | CnfPasswordPolicy 实体类 |
| 密码复杂度规则 | 定义密码的复杂度要求,如大小写字母、数字、特殊字符的数量 | CnfPasswordPolicy 实体类 |
| 密码历史规则 | 定义密码历史检查,避免使用历史密码 | CnfPasswordPolicy 实体类 |
| 密码尝试规则 | 定义密码错误尝试次数和锁定时间 | CnfPasswordPolicy 实体类 |
| 密码过期规则 | 定义密码的过期时间 | CnfPasswordPolicy 实体类 |
7.3 权限规则
| 规则名称 | 描述 | 实现方式 |
|---|---|---|
| 基于角色的授权规则 | 基于用户角色进行权限控制 | 使用 Spring Security 的基于角色的授权 |
| 基于资源的授权规则 | 基于资源进行权限控制 | Permission 和 Resources 实体类 |
| 基于用户组的授权规则 | 基于用户组进行权限控制 | Groups 和 GroupMember 实体类 |
8. 技术栈
8.1 核心技术
| 技术 | 版本 | 用途 |
|---|---|---|
| Java | 17+ | 开发语言 |
| Spring Boot | 3.5+ | 应用框架 |
| Spring Security | 6.5+ | 安全框架 |
| MyBatis | 3.5.19 | ORM 框架 |
| Gradle | 7.6+ | 构建工具 |
| Angular | 16+ | 前端框架 |
| MySQL/PostgreSQL | 8.0+/14+ | 数据库 |
8.2 认证协议
| 协议 | 版本 | 用途 |
|---|---|---|
| OAuth 2.0 | - | 授权协议 |
| OpenID Connect | - | 身份认证协议 |
| SAML 2.0 | - | 单点登录协议 |
| CAS | 3.0+ | 中央认证服务 |
| JWT | - | 令牌协议 |
| SCIM 2.0 | - | 用户管理协议 |
9. 代码转设计总结
9.1 设计优势
- 模块化设计:系统采用模块化的设计,各个模块职责明确,便于维护和扩展。
- 分层架构:采用经典的分层架构,层次清晰,职责分明。
- 设计模式应用:合理应用了多种设计模式,如抽象工厂、策略、模板方法等,提高了代码的可维护性和可扩展性。
- 标准协议支持:支持多种标准认证协议,如 OAuth 2.0、SAML 2.0、CAS 等,便于与其他系统集成。
- 安全性:注重安全设计,如密码加密、权限控制、会话管理等。
- 可配置性:大部分功能都可以通过配置进行调整,如认证方式、密码策略等。
9.2 设计挑战
- 复杂性:系统功能丰富,模块众多,增加了系统的复杂性。
- 性能:随着用户和应用数量的增加,系统性能可能成为挑战。
- 可扩展性:需要考虑系统的横向扩展能力,以应对高并发场景。
- 安全性:需要不断更新安全策略,以应对新的安全威胁。
9.3 优化建议
-
性能优化:
- 增加缓存机制,减少数据库查询
- 优化认证流程,减少不必要的步骤
- 考虑使用分布式架构,提高系统的并发处理能力
-
可扩展性优化:
- 采用微服务架构,将系统拆分为多个独立的服务
- 提供插件机制,便于扩展新的功能
- 优化 API 设计,提高系统的可集成性
-
安全性优化:
- 加强密码加密机制,使用更安全的加密算法
- 增加多因素认证的支持
- 加强会话管理,防止会话劫持
-
代码质量优化:
- 增加单元测试和集成测试,提高代码质量
- 优化代码结构,减少代码冗余
- 加强代码注释,提高代码的可读性
10. 结论
MaxKey 是一个功能丰富、设计合理的身份和访问管理系统。通过代码转设计分析,我们了解了系统的架构设计、核心模块、设计模式和业务流程。系统采用模块化设计、分层架构和多种设计模式,支持多种标准认证协议,具有良好的可维护性和可扩展性。
通过不断优化系统设计,MaxKey 可以更好地满足企业级应用的需求,为用户提供更安全、更便捷的身份和访问管理服务。
附MaxKey 简介
MaxKey 是一款开源的统一身份认证(IAM)解决方案,支持 OAuth 2.0、OIDC、SAML 2.0 等协议,适用于企业级单点登录(SSO)和身份管理。
核心功能
- 多协议支持:集成主流认证协议,如 OAuth 2.0、OpenID Connect、SAML 2.0 等。
- 单点登录(SSO):用户一次登录即可访问多个系统,提升用户体验。
- 用户管理:提供用户生命周期管理、角色权限分配等功能。
- 高可用性:支持集群部署,确保服务稳定性。
部署与使用
-
环境要求
- JDK 1.8+
- MySQL 5.7+ 或 PostgreSQL
- Tomcat 8+ 或 Docker
-
快速启动
- 下载发布包或通过 Docker 运行:
docker pull dromara/maxkey docker run -d --name maxkey dromara/maxkey - 访问
http://localhost:9527,默认管理员账号为admin/maxkey。
- 下载发布包或通过 Docker 运行:
-
配置集成
- 通过管理后台添加应用,配置协议参数(如 OAuth 的
client_id和redirect_uri)。 - 参考官方文档对接企业现有系统。
- 通过管理后台添加应用,配置协议参数(如 OAuth 的
扩展与开发
- 自定义认证源:支持 LDAP、数据库、API 等多种用户数据源。
- 插件开发:通过扩展接口实现特定业务逻辑,如多因素认证(MFA)。
参考资料
- GitHub 仓库:dromara/MaxKey
- 官方文档:包含详细配置指南和 API 说明。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐




所有评论(0)