You need to enable JavaScript to run this app.
文档中心
缓存数据库 Redis 版

缓存数据库 Redis 版

复制全文
下载 pdf
最佳实践
基于 Redis 实现集中式 session 单点登录(SSO)
复制全文
下载 pdf
基于 Redis 实现集中式 session 单点登录(SSO)
本文介绍基于缓存数据库 Redis 版实现集中式 session 单点登录的解决方案。​
方案目标​
随着企业信息系统的规模持续扩大,架构也日益复杂,用户常常需要在不同业务平台之间频繁切换。传统的多系统独立登录模式不仅导致操作繁琐、体验割裂,还可能因账号信息的重复管理引入安全风险。为应对上述挑战,单点登录(Single Sign-On,简称 SSO)技术应运而生,并逐步成为实现统一身份认证与访问管理的常用解决方案。​
本方案适用于企业内部多系统集成、微服务架构下的统一身份认证场景,旨在利用 Redis 集中式会话管理能力,来构建一套高效、稳定、易扩展的 SSO 系统。通过该系统,用户仅需在认证中心完成一次登录,即可无缝访问所有已授权的业务系统,而无需重复验证身份,提升用户操作便捷性的同时,也增强了企业系统的整体安全性。​
本方案可实现如下目标:​
  • 实现多业务系统间的登录状态共享,确保用户一次登录即可无缝访问所有授权服务。​
  • 将 Redis 作为统一会话存储中心,保障分布式环境下 session 的一致性和高可用性。​
  • 设计简洁明了的登录与登出流程,确保身份认证过程的安全性和可靠性。​
  • 构建清晰易用的系统架构和代码实现,方便后续维护和功能扩展。​
方案架构​
核心组件​
本 SSO 登录系统主要包含如下核心组件:​
  • 认证中心​
  • 作为用户身份认证的统一入口,该组件负责接收用户登录请求并验证身份信息。认证成功后,系统将在 Redis 中生成唯一的 session ID,并将该 ID 通过 HTTP cookie 下发至客户端浏览器,建立登录状态。同时,认证中心还提供登出接口,用于清理 session 和 cookie,实现统一登出。​
  • Redis 集中式 session 存储​
  • Redis 作为高性能的内存数据库,承担所有登录 session 的集中存储任务。所有业务系统通过访问 Redis 来共享同一份 session 数据,实现登录状态的跨系统共享,保证分布式环境下的状态一致性和高效访问。​
  • 业务系统​
  • 各业务系统(例如 Service A,Service B)通过读取客户端 cookie 中的 session ID,向 Redis 查询对应的用户信息,判断用户是否已登录。若登录有效,业务系统将允许用户访问相应资源;若未登录,则重定向至认证中心的登录页面,实现统一认证流程。​
基于缓存数据库 Redis 版实现集中式 session 单点登录的系统架构设计如下图所示。​
​​​
架构优势​
本方案架构具备如下优势:​
  • Session 集中化存储​
  • 基于 Redis 实现会话信息的统一存储管理,解决了传统单机 session 在分布式环境下的状态同步问题,确保所有业务系统能够实时获取最新的用户登录状态。​
  • 基于 cookie 的无感状态传递​
  • 用户在认证中心登录后,系统将 session ID 写入 HTTP cookie,并由浏览器自动携带该 cookie 访问业务系统,实现无感的登录状态传递。​
  • 统一的登录登出流程​
  • 用户仅需在认证中心登录一次,系统即可在所有业务中共享登录状态。登出时,认证中心负责清理 Redis 中的 session 及浏览器 cookie,确保所有业务的访问权限同步失效,保障安全。​
  • 灵活的系统扩展性​
  • Session 集中存储在 Redis,新业务系统仅需接入 Redis 验证 session,无需额外复杂集成即可快速融入现有认证体系,降低系统维护的复杂度与成本。​
方案实现​
准备工作​
您需要提前准备如下资源并为各资源设置相关配置。​
​
资源分类​
所需配置​
Redis​
在本解决方案中需要准备如下缓存数据库 Redis 版相关资源:​
  • 创建 Redis 7.0 实例。具体操作步骤,请参见创建实例。​
  • 为 Redis 实例设置访问白名单。具体操作步骤,请参见创建白名单。​
ECS​
在本解决方案中需要准备如下 ECS 相关资源:​
  • 在 ECS 服务器上安装 Redis Python 客户端和 Flask 依赖包。​
说明​
需确保使用的是 Python 3.10 版本。您可以通过 python --version 命令检查当前 Python 的版本。​
  • 本解决方案中的登录系统所用端口为 5000,5001 和 5002。因此,您需要将上述 3 个端口分别添加至 ECS 实例的安全组访问规则中,需确保出方向和入方向的安全组规则中均允许访问上述 3 个端口。安全组规则设置方法,请参见管理安全组规则。​
​
操作步骤​
  1. 登录已安装对应环境的 ECS 实例。ECS 实例登录方法,请参见登录实例。​
  1. 在 ECS 的命令行窗口或命令终端工具中,执行如下命令克隆代码。​
  • ​
    git clone https://github.com/volcengine/cache_for_redis_examples.git​
    cd cache_for_redis_examples/sso_login​
    ​
  1. 进入 SSO 登录系统项目的目录,找到 config.py 文件,并根据您 Redis 和 ECS 实例的实际情况修改对应配置。​
说明​
  • 以下代码仅展示了 SSO 登录系统的项目中,涉及缓存数据库 Redis 版和 ECS 实例的配置部分。​
  • 您可以在 Redis 控制台上查看实例的连接地址域名和端口号。具体操作步骤,请参见查看连接地址。​
  • 若您忘记 Redis 实例 default 账号的密码,您也可以在控制台上重置密码。具体操作步骤,请参见重置密码。​
  • ​
    # config​
    ​
    # 服务器 IP 或域名​
    SERVER_HOST = '<Public IP of ECS>'​
    ​
    # 认证中心配置​
    AUTH_SERVER_PORT = 5000​
    ​
    # 业务服务 A 配置​
    SERVICE_A_PORT = 5001​
    ​
    # 业务服务 B 配置​
    SERVICE_B_PORT = 5002​
    ​
    # Redis 配置​
    REDIS_HOST = '<Connection address of Redis instance>'​
    REDIS_PORT = <Port of Redis connection address, default port 6379>​
    REDIS_PASSWORD = <Password for default account in Redis instance>​
    ​
    # Session 有效期(秒)​
    SESSION_EXPIRE = 3600​
    ​
  • 代码示例如下。​
  • ​
    # config​
    ​
    # 服务器 IP 或域名​
    SERVER_HOST = '180.184.***.***'​
    ​
    # 认证中心配置​
    AUTH_SERVER_PORT = 5000​
    ​
    # 业务服务 A 配置​
    SERVICE_A_PORT = 5001​
    ​
    # 业务服务 B 配置​
    SERVICE_B_PORT = 5002​
    ​
    # Redis 配置​
    REDIS_HOST = 'redis-cnlfwm1ecuiqv****.redis.ivolces.com'​
    REDIS_PORT = 6379​
    REDIS_PASSWORD = "<your-redis-password>"​
    ​
    # Session 有效期(秒)​
    SESSION_EXPIRE = 3600​
    ​
  1. 在 SSO 登录系统项目的根目录下,执行如下命令启动服务。​
  • ​
    python3 auth_server.py​
    python3 service_a.py​
    python3 service_b.py​
    ​
  1. 打开浏览器,在 URL 地址中输入 http://<ECS 的公网 IP>:5000/login 打开 SSO 登录系统的访问认证中心界面。​
  • 代码示例如下。​
  • ​
    http://180.184.***.***:5000/login​
    ​
实现效果​
说明​
执行如下操作前,已在 SSO 登录系统项目的 auth_server.py 文件中,通过硬编码的方式在 login 函数中录入了 user1: password1 和 user2: password2 两个用户的登录信息。​
  1. 在 SSO 登录系统的访问认证中心界面,输入用户名(例如 user1)和密码(例如 password1)后,单击登录进行身份验证。​
  1. 登录成功后会自动跳转至服务选择界面,您可以自行选择进入服务 A 或者服务 B。​
  • 本文示例中选择进入服务 A,选择后无需再次输入密码即可跳转至对应服务的网页完成登录,因为在用户访问前,系统已向 Redis 请求该用户的 session,浏览器会通过 cookie 自动携带该 session。​
  • 用户登出或 session 到期后,系统会清除 Redis 中的 session,用户再次访问时需要重新进行身份验证完成登录。​
​
最近更新时间:2026.10.22 14:41:13
这个页面对您有帮助吗?
有用
有用
无用
无用