单点登录设计分析

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 类负责创建不同类型的认证提供者,如 NormalAuthenticationProviderMobileAuthenticationProvider 等。

优势

  • 提供了统一的接口来创建不同类型的认证提供者
  • 隐藏了具体实现的细节,便于扩展新的认证方式

3.2 策略模式

应用场景:认证方式的选择

实现:不同的认证提供者实现了 AbstractAuthenticationProvider 抽象类,提供了不同的认证策略。

优势

  • 可以动态选择不同的认证策略
  • 便于添加新的认证方式,无需修改现有代码

3.3 模板方法模式

应用场景:认证流程的处理

实现AbstractAuthenticationProvider 类定义了认证的基本流程,具体的认证提供者实现了 doAuthenticate 方法。

优势

  • 统一了认证流程的结构
  • 子类可以专注于实现具体的认证逻辑

3.4 单例模式

应用场景:全局配置和服务

实现ApplicationConfigSessionManager 等核心服务采用单例模式。

优势

  • 确保全局只有一个实例,避免资源浪费
  • 提供了统一的访问点

3.5 观察者模式

应用场景:会话管理和事件处理

实现SessionListenerAdapter 类实现了会话事件的监听和处理。

优势

  • 实现了松耦合的事件处理机制
  • 便于添加新的事件监听器

3.6 适配器模式

应用场景:不同认证协议的适配

实现:各种协议模块(如 OAuth 2.0、SAML 2.0)实现了相应的适配器。

优势

  • 统一了不同协议的接口
  • 便于集成新的认证协议

4. 架构设计

4.1 分层架构

MaxKey 采用经典的分层架构,包括:

  1. 表现层:Web 界面和 API,负责处理用户请求
  2. 业务逻辑层:认证、授权、用户管理等核心业务逻辑
  3. 数据访问层:数据库操作、缓存等
  4. 基础设施层:通用工具、配置管理等

4.2 核心流程

4.2.1 认证流程
  1. 请求处理:接收用户认证请求
  2. 凭证验证:验证用户凭证的合法性
  3. 用户状态检查:检查用户的状态是否正常
  4. 密码策略验证:验证密码是否符合策略要求
  5. 会话创建:创建用户会话
  6. 权限授予:授予用户相应的权限
  7. 登录历史记录:记录用户登录历史
4.2.2 授权流程
  1. 资源访问请求:用户请求访问资源
  2. 权限检查:检查用户是否有访问该资源的权限
  3. 授权决策:根据权限检查结果决定是否授权
  4. 访问控制:执行访问控制,允许或拒绝访问

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 授权流程

数据库 授权服务器 客户端 数据库 授权服务器 客户端 alt [有权限] [无权限] 请求访问资源 验证用户会话 查询用户权限 返回权限信息 检查权限 允许访问 拒绝访问

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 设计优势

  1. 模块化设计:系统采用模块化的设计,各个模块职责明确,便于维护和扩展。
  2. 分层架构:采用经典的分层架构,层次清晰,职责分明。
  3. 设计模式应用:合理应用了多种设计模式,如抽象工厂、策略、模板方法等,提高了代码的可维护性和可扩展性。
  4. 标准协议支持:支持多种标准认证协议,如 OAuth 2.0、SAML 2.0、CAS 等,便于与其他系统集成。
  5. 安全性:注重安全设计,如密码加密、权限控制、会话管理等。
  6. 可配置性:大部分功能都可以通过配置进行调整,如认证方式、密码策略等。

9.2 设计挑战

  1. 复杂性:系统功能丰富,模块众多,增加了系统的复杂性。
  2. 性能:随着用户和应用数量的增加,系统性能可能成为挑战。
  3. 可扩展性:需要考虑系统的横向扩展能力,以应对高并发场景。
  4. 安全性:需要不断更新安全策略,以应对新的安全威胁。

9.3 优化建议

  1. 性能优化

    • 增加缓存机制,减少数据库查询
    • 优化认证流程,减少不必要的步骤
    • 考虑使用分布式架构,提高系统的并发处理能力
  2. 可扩展性优化

    • 采用微服务架构,将系统拆分为多个独立的服务
    • 提供插件机制,便于扩展新的功能
    • 优化 API 设计,提高系统的可集成性
  3. 安全性优化

    • 加强密码加密机制,使用更安全的加密算法
    • 增加多因素认证的支持
    • 加强会话管理,防止会话劫持
  4. 代码质量优化

    • 增加单元测试和集成测试,提高代码质量
    • 优化代码结构,减少代码冗余
    • 加强代码注释,提高代码的可读性

10. 结论

MaxKey 是一个功能丰富、设计合理的身份和访问管理系统。通过代码转设计分析,我们了解了系统的架构设计、核心模块、设计模式和业务流程。系统采用模块化设计、分层架构和多种设计模式,支持多种标准认证协议,具有良好的可维护性和可扩展性。

通过不断优化系统设计,MaxKey 可以更好地满足企业级应用的需求,为用户提供更安全、更便捷的身份和访问管理服务。
在这里插入图片描述

附MaxKey 简介

MaxKey 是一款开源的统一身份认证(IAM)解决方案,支持 OAuth 2.0、OIDC、SAML 2.0 等协议,适用于企业级单点登录(SSO)和身份管理。

核心功能

  • 多协议支持:集成主流认证协议,如 OAuth 2.0、OpenID Connect、SAML 2.0 等。
  • 单点登录(SSO):用户一次登录即可访问多个系统,提升用户体验。
  • 用户管理:提供用户生命周期管理、角色权限分配等功能。
  • 高可用性:支持集群部署,确保服务稳定性。

部署与使用

  1. 环境要求

    • JDK 1.8+
    • MySQL 5.7+ 或 PostgreSQL
    • Tomcat 8+ 或 Docker
  2. 快速启动

    • 下载发布包或通过 Docker 运行:
      docker pull dromara/maxkey  
      docker run -d --name maxkey dromara/maxkey  
      
    • 访问 http://localhost:9527,默认管理员账号为 admin/maxkey
  3. 配置集成

    • 通过管理后台添加应用,配置协议参数(如 OAuth 的 client_idredirect_uri)。
    • 参考官方文档对接企业现有系统。

扩展与开发

  • 自定义认证源:支持 LDAP、数据库、API 等多种用户数据源。
  • 插件开发:通过扩展接口实现特定业务逻辑,如多因素认证(MFA)。

参考资料

  • GitHub 仓库:dromara/MaxKey
  • 官方文档:包含详细配置指南和 API 说明。
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐