SSO单点登录设计思路

编程教程 > Java (1329) 2025-01-27 10:26:51

一、前言

1、SSO说明

SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。https://baike.baidu.com/item/SSO/3451380

例如访问在网易账号中心(http://reg.163.com/ )登录之后
访问以下站点都是登录状态

2、设计目标

本篇文章也主要是为了探讨如何设计&实现一个SSO系统

以下为需要实现的核心功能:

  • 单点登录
  • 单点登出
  • 支持跨域单点登录
  • 支持跨域单点登出

二、SSO设计与实现

1、核心应用与依赖

单点登录(SSO)设计

应用/模块/对象 说明
前台站点 需要登录的站点
SSO站点-登录 提供登录的页面
SSO站点-登出 提供注销登录的入口
SSO服务-登录 提供登录服务
SSO服务-登录状态 提供登录状态校验/登录信息查询的服务
SSO服务-登出 提供用户注销登录的服务
数据库 存储用户账户信息
缓存 存储用户的登录信息,通常使用Redis

2、用户登录状态的存储与校验

常见的Web框架对于Session的实现都是生成一个SessionId存储在浏览器Cookie中。然后将Session内容存储在服务器端内存中,这个 ken.io 在之前Session工作原理中也提到过。整体也是借鉴这个思路。
用户登录成功之后,生成AuthToken交给客户端保存。如果是浏览器,就保存在Cookie中。如果是手机App就保存在App本地缓存中。本篇主要探讨基于Web站点的SSO。
用户在浏览需要登录的页面时,客户端将AuthToken提交给SSO服务校验登录状态/获取用户登录信息

对于登录信息的存储,建议采用Redis,使用Redis集群来存储登录信息,既可以保证高可用,又可以线性扩充。同时也可以让SSO服务满足负载均衡/可伸缩的需求。

对象 说明
AuthToken 直接使用UUID/GUID即可,如果有验证AuthToken合法性需求,可以将UserName+时间戳加密生成,服务端解密之后验证合法性
登录信息 通常是将UserId,UserName缓存起来

3、用户登录/登录校验

  • 登录时序图

SSO系统设计-登录时序图

按照上图,用户登录后Authtoken保存在Cookie中。 domian= test. com
浏览器会将domain设置成 .test.com,
这样访问所有*.test.com的web站点,都会将Authtoken携带到服务器端。
然后通过SSO服务,完成对用户状态的校验/用户登录信息的获取

  • 登录信息获取/登录状态校验

SSO系统设计-登录信息获取/登录状态校验

4、用户登出

用户登出时要做的事情很简单:

  1. 服务端清除缓存(Redis)中的登录状态
  2. 客户端清除存储的AuthToken
  • 登出时序图

SSO系统设计-用户登出

5、跨域登录、登出

前面提到过,核心思路是客户端存储AuthToken,服务器端通过Redis存储登录信息。由于客户端是将AuthToken存储在Cookie中的。所以跨域要解决的问题,就是如何解决Cookie的跨域读写问题。

解决跨域的核心思路就是:

  • 登录完成之后通过回调的方式,将AuthToken传递给主域名之外的站点,该站点自行将AuthToken保存在当前域下的Cookie中。
  • 登出完成之后通过回调的方式,调用非主域名站点的登出页面,完成设置Cookie中的AuthToken过期的操作。
  • 跨域登录(主域名已登录)

SSO系统设计-跨域登录(主域名已登录)

  • 跨域登录(主域名未登录)

SSO系统设计-跨域登录(主域名未登录)

  • 跨域登出

SSO系统设计-跨域登出


评论
User Image
提示:请评论与当前内容相关的回复,广告、推广或无关内容将被删除。

相关文章
一、前言1、SSO说明SSO英文全称Single Sign On,单点登录
一  编辑SSH配置文件启用证书登录vim /etc/ssh/sshd_config找到#PubkeyAuthentication yes将前面的#注释删除,后面必须是yes二 重启SSHD服务...
rutracker 免登录搜索rutracker 无账号搜索众所周知rutracker上的游戏还是挺多的,如果不通过搜索想要找到自己想要的游戏还是难。rutracker上直接搜索是需要登录账号的...
生成SSH公钥和私钥ssh-keygen -t rsa #注意生成时设置密钥的密码,这样在利用证书登录时就会先验证密码导入公钥#导入公钥到服务器用户ssh证书列表 cat ~/.ssh/id...
介绍在本教程中,我们将探索另一种流行的行为设计模式 - 状态设计模式
简介商品模块是电商系统核心模块,本文主要讲解商品模块功能需求、术语概念、功能设计、数据结构、相关功能设计思路。需求分析电商系统后台可以管理商品(功能需求);管理
jquery模拟点击事件写法//语法:$(selector).trigger("click");$('#test).trigger("click"); over
centos 7 禁止root用户远程登录,以保护root密码被猜,centos 7
简介在主流公司的程序开发中,为了提高程序开发迭代的速度,基本都是前后端分离架构,而前端既包括网页、App、小程序等等,因此必须要有一个统一的规范用于约束前后端的
通过PowerDesigner ojdbc驱动连接数据库进行逆向导出数据库表设计文档(Excel)
解法一:只适合单线程环境(不建议)public class Singleton { private static Singleton instance=null
前言在学习RESTful 风格接口之前,即使你不知道它是什么,但你肯定会好奇它能解决什么问题?有什么应用场景?听完下面描述我想你就会明白:在互联网并没有完全流行
Linux(centos)系统远程(SSH)登录输入错误密码多次锁定账号时间PAM实现方式
spring boot 2.0 security 5.0 整合,实现自定义表单登录。spring boot 2.0框架使用。
前言spring boot 项目常用的几个类设计,方便快速搭建项目错误处理模块。代码片段 错误枚举定义@Getterpublic enum ErrorCodeE