当前位置: 首页 > news >正文

详细了解如何设计和实现一个SSO系统?

一、SSO系统有什么好处?

1、用户角度:一次登录多次使用,无需记录多套用户名和密码,省事省心。

2、系统管理员角度:管理员只需要维护好一个统一的账号中心就可以了,方便

3、新系统开发角度:新系统开发时只需直接对接统一的账号中心即可,简化开发流程,省时

二、SSO设计与实现?

本篇主要探讨基于Web站点的SSO ,核心包括:单点登录和登出、支持跨域单点登录和登出

核心应用和依赖

三、用户登录状态的存储跟校验?

 常见的Web框架对于Session的实现都是生成一个SessionId存储在浏览器Cookie中,然后将Session内容存储在服务器内存中,用户登录成功之后,生成AuthToken交给客户端保存,如果是浏览器,就保存在Cookie中,如果是手机APP就保存在APP本地缓存中。用户在浏览需要登录的页面时,客户端将AuthToken提交给SSO服务校验登录状态/获取用户登录信息,对于登录信息的存储,建议采用Redis,使用Redis集群来存储登录信息,既可以保证高可用,又可以线性扩充,同时也可以让SSO服务满足负载均衡/可伸缩的需求。

用户登录/校验时序图如下

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

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

 用户登出:

1、服务端清除缓存(redis)中的登录状态

2、客户端清除存储的AuthToken

登出时序图

跨域登录/登出

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

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

 我们下一章具体看跨域登出问题,包括主域名登录和主域名未登录两种情况。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • C++ 设计模式——享元模式
  • 统一 transformer 与 diffusion !Meta 融合新方法剑指下一代多模态王者
  • 速盾:cdn能防ip追踪吗?
  • jieba分词和RecursiveCharacterTextSplitter分词
  • electron rce
  • Milvus在数派数据大模型业务中的实践
  • 坐牢第三十天(c++)
  • [C++] C++11详解 (一)
  • 【模型】Temporal Fusion Transformer (TFT) 模型
  • 算法学习-基础算法
  • Visual Studio 2022 自定义字体大小
  • 摄像头设备问题如何检测
  • leetcode518:零钱兑换II
  • minio 后端大文件分片上传,合并,删除分片
  • 【线程安全】ReentrantLock和synchronized的使用示例——言简意赅
  • [笔记] php常见简单功能及函数
  • Centos6.8 使用rpm安装mysql5.7
  • CSS 提示工具(Tooltip)
  • CSS3 变换
  • echarts花样作死的坑
  • Facebook AccountKit 接入的坑点
  • JavaScript新鲜事·第5期
  • JS变量作用域
  • PermissionScope Swift4 兼容问题
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React-redux的原理以及使用
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • Vue官网教程学习过程中值得记录的一些事情
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 前端_面试
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 原生JS动态加载JS、CSS文件及代码脚本
  • 扩展资源服务器解决oauth2 性能瓶颈
  • #### golang中【堆】的使用及底层 ####
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • (003)SlickEdit Unity的补全
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (pytorch进阶之路)扩散概率模型
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (十一)图像的罗伯特梯度锐化
  • (四)JPA - JQPL 实现增删改查
  • (四)stm32之通信协议
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)memcache、redis缓存
  • .ai域名是什么后缀?
  • .Net Core中Quartz的使用方法
  • .NET DevOps 接入指南 | 1. GitLab 安装
  • .net 提取注释生成API文档 帮助文档
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题