单点登录方案调研与实现

作用

在一个系统登录后,其他系统也能共享该登录状态,无需重新登录。

演进

cookie → session → token →单点登录

Cookie

可以实现浏览器和服务器状态的记录,但Cookie会出现存储体积过大和可以在前后端修改的问题

Session

为了解决Cookie的数据敏感问题,Session应运而生。

  • 常见的实现方式是基于Cookie。只将口令放置Cookie,通过口令实现前后端数据的映射,大部分数据存储于服务器的session中,这里会有一个全局sessions去存储每个用户的session,并设置每个的有效期,一般20分钟。超时则重新生成和更新全局sessions。
  • 分布式问题:通常服务器是集群,用户的请求会走到负载均衡,不一定打在同一台登录请求的机器上,那不就 session 失效了吗
    • 解决方案:
      • 第一种,把 session 集中存储,给个独立的 redis 或普通数据库
      • 第二种,将相同 ip 请求的负载均衡都打在同一台机器上。
    • 通常是第一种,因为第二种的同一台机器会出现请求过多宕机的问题。

token

  • 解决场景

    session 的维护给服务端造成很大困扰,我们必须找地方存放它,又要考虑分布式的问题,甚至要单独为了它启用一套 Redis 集群。有没有更好的办法?——token

    登录场景不需要往 session 存太多东西,那为何不直接打包到 cookie 中呢?这样服务端就不用存了,每次核验 cookie 带的 token 有效性就可以了,还可以存一些轻量的信息。

  • HTTP 头部

    token 认证则不需要后台保存,token一般放在HTTP请求头的 Authorization 中

  • 流程

    • 输入用户密码,通过的话,服务器返回 token
    • 浏览器每次携带该 token 去请求数据

来源

最早起源于多服务器间 session 数据一致的问题。

方案

关键如何让 Session ID(或 Token 在多个域中共享)

不同的项目情况,适用不同的方案,适合的才是最好的

按照域名划分方式分类:

同主域

一个企业,一般情况下只有一个域名,通过二级域名区分不同的系统。

二级域名不同也算跨域。当协议,域名,端口其中一个不同时,就算跨域了。

例如 aliyun.com,其他业务系统分别为:a.aliyun.comb.aliyun.com ,要做单点登录,需要一个登录系统,叫做 account.aliyun.com ,我们只要在 acount.aliyun.com 登录了,a.aliyun.comb.aliyun.com 也登陆了

实现

  • 方法一: Root Cookie 方式
    • 原理:同一域名下的不同子域名属于同一主域名,主域名下的 cookie 在不同子域名中都是可见的。

    • 将得到的 ticket 写入根 Cookie 里,通过修改 domain。这一步前后端择一写即可

      利用二级域名写一级域名的 Cookie, acount.aliyun.com 登录后,可将 cookie 的域设置为顶域,即 .aliyun.com ,这样所有的子域都可以访问到顶域的 cookie

      • 前端:react 和 vue 都有 js-cookie 包

        import Cookies from 'js-cookie'
        Cookies.set('key', 'value', { domain: 'localhost' })
        

        前提:后端没有配置 httpOnly,否则无法通过 document.cookie 方式读写,但有些浏览器仍支持写入。

      后端:java

      Cookie cookie = new Cookie("key", "value");cookie.setDomain('.example.com')
      

      无需在 domain 后加上端口号。设置完后,同主域名的网址打开浏览器的存储,便能看到 cookie 了。

    • 总结:实现简单,不支持跨主域名的方式

  • 方法二:postMessage + iframe 方案,无需后端参与
    • 可以实现同主域和不同主域,不同的是同主域的实现即便关闭后,再打开也没问题。不同主域的,关闭后就不会保存了。监听 message 的同时,在 postMessage 后,窗口就会触发了。

    • cross-storage 库,实现了对该方案的封装

      • 原理:类似中转站,所有的登录信息的存储或获取都通过该中转站
      • 使用注意
        • 如果无法连接成功的,可以考虑将初始化代码放入 html 中,并单独开启一个服务器(例如小型 node),用来对该页面的访问。

        • CrossStorageHub.init 时,localhost 和 域名都要写上

          CrossStorageHub.init([{origin: /.*localhost:808\d$/, allow: ['get', 'set', 'del']},{origin: /.*data.com:300\d$/, allow: ['get', 'set', 'del']}
          }]
          
    • 缺陷:Safari 浏览器不兼容该方案

      • 原因:postMessage + iframe(cross-storage)由于 safari 浏览器只支持和 iframe 通信,不支持新窗口通信,无论是通过 iframe.src 带上 token 的 query 还是通过 postMessage 存储到 localStorage 里。新打开一个窗口后,localStorage 里都没有之前的存储值。
        在这里插入图片描述

      • cross-storage 的文档,也给出了降级方案

        • 可以采用 root cookie 方式
        • 让服务端返回的方式
        • 直接去改变safari浏览器的配置。 (不建议)

        在这里插入图片描述

        • 跳转的 url 链接带上该 token 的 query,前提是要点击后才能触发。再保存到本地

不同主域

实现:

  • 方法一:

    部署一个 SSO 认证中心,专门负责处理登录请求(登录、登出、获取用户信息、当前用户状态),是单点登录的标准做法。

    类似中转站,所有子系统的登录都要询问一遍这个中转站

    CAS: 基于 SSO 认证中心的开源项目代表,Central Authentication Service 即中央认证服务

  • 方法二:iframe + postMessage 的方式

    同上

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/214064.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

企业微信配置可信域名

首先去申请一个域名,然后将域名绑定到有公网ip的云服务器上,绑定到具体的网站;然后再企业微信,管理后台,点击具体的应用,进【网页授权及JS-SDK】;点击底部的【申请校验域名】点击下载文件&#…

数据可视化|jupyter notebook运行pyecharts,无法正常显示“可视化图形”,怎么解决?

前言 本文是该专栏的第39篇,后面会持续分享python数据分析的干货知识,记得关注。 相信有些同学在本地使用jupyter notebook运行pyecharts的时候,在代码没有任何异常的情况下,无论是html还是notebook区域,都无法显示“可视化图形”,界面区域只有空白一片。遇到这种情况,…

UniGui使用CSSUniTreeMenu滚动条

有些人反应UniTreeMenu当菜单项目比较多的时候会超出但是没有出滚动条,只需要添加如下CSS 老规矩,unitreemeu的layout的componentcls里添加bbtreemenu,然后在css里添加 .bbtreemenu .x-box-item{ overflow-y: auto; } 然后当内容超出后就会…

TypeScript中的单件设计模式

基本概念 (1) 了解设计模式 设计模式通俗的讲,就是一种更好的编写代码方案,打个比喻:从上海到武汉,你可以选择做飞机,做轮船,开车,骑摩托车多种方式,把出行…

ubuntu安装docker及docker常用命令

docker里有三个部分 daemon 镜像 和 容器 我们需要了解的概念 容器 镜像 数据卷 文章目录 docker命令docker镜像相关命令docker容器相关命令数据卷ubuntu安装docker docker命令 #启动,停止,重启docker systemctl start docker systemctl stop docker s…

pytorch:YOLOV1的pytorch实现

pytorch:YOLOV1的pytorch实现 注:本篇仅为学习记录、学习笔记,请谨慎参考,如果有错误请评论指出。 参考: 动手学习深度学习pytorch版——从零开始实现YOLOv1 目标检测模型YOLO-V1损失函数详解 3.1 YOLO系列理论合集(Y…

Notes数据直接在Excel中统计

大家好,才是真的好。 我希望你看过前面两篇内容《Domino REST API安装和运行》和《Domino REST API安装和运行》,因为今天我们正是使用REST API方式在Excel中查询和统计Notes数据。 不过首先你得知道一个OData协议,全名Open Data Protocol(…

配置OSS后如何将服务器已有文件上传至OSS,推荐使用ossutil使用

1.下载安装ossutil sudo -v ; curl https://gosspublic.alicdn.com/ossutil/install.sh | sudo bash2.交互式配置生成配置文件 ossutil config 根据提示分别设置配置文件路径、设置工具的语言、Endpoint、AccessKey ID、AccessKey Secret和STSToken参数,STSToken留…

Android 分享小结

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、微信 分享 三、 QQ 、QQ空间(Qz…

python安装与工具PyCharm

摘要: 周末闲来无事学习一下python!不是你菜鸡,只不过是对手太强了!所以你要不断努力,去追求更高的未来!下面先了解python与环境的安装与工具的配置! python安装: 官网 进入官网下载…

iOS分段控件UISegmentedControl使用

在故事板中添加UISegmentedControl 具体添加步聚如下: 选择Xcode的View菜单下的Show Library (或者Shift+Common+L) 打开控件库如下 在控件库中输入seg搜索控件,在出现Segmented Control后,将其拖到View Controller Scene中 到这里,添加分段控件UI已完成, 接下来将控件与变量…

Qt/C++视频监控拉流显示/各种rtsp/rtmp/http视频流/摄像头采集/视频监控回放/录像存储

一、前言 本视频播放组件陆陆续续写了6年多,一直在持续更新迭代,视频监控行业客户端软件开发首要需求就是拉流显示,比如给定一个rtsp视频流地址,你需要在软件上显示实时画面,其次就是录像保存,再次就是一些…

HarmonyOS--ArkTS(1)--基本语法(1)

目录 基本语法概述 声明式UI描述 自定义组件 创建自定义组件 自定义组件的结构--struct ,Component,build()函数 生命周期 基本语法概述 装饰器: 用于装饰类、结构、方法以及变量,并赋予其特殊的含义。如上述示例中Entry、C…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 2 “架构 AWS”

接续上一章节,我们把开发环境架设好之后,此章节叙述如何建立 AWS IoT 环境,请务必已经有 AWS Account,申请 AWS Account 之流程将不在此说明。 III-1. 登入AWS IoT, 在“管理”>“所有装置”>“实物”下点击“建…

Avalonia中如何将View事件映射到ViewModel层

前言 前面的文章里面我们有介绍在Wpf中如何在View层将事件映射到ViewModel层的文章,传送门,既然WPF和Avalonia是两套不同的前端框架,那么WPF里面实现模式肯定在这边就用不了,本篇我们将分享一下如何在Avalonia前端框架下面将事件…

【React Hooks】=> useId()

相比较使用全局变量 作为唯一 ID 和直接使用 useId 是有区别的。 官方解释如下: 如果是将 useId 作为 id 的情况下,是如下的形式 也就是说你使用了 useId 作为唯一 ID 那么在你删除数组某个元素之后不会导致某个 ID 被重复使用,如果使用的全…

分布式环境下的session 共享-基于spring-session组件和Redis实现

1、问题概述 不是所有的项目都是单机模式的,当一个项目服务的局域比较广,用户体量比较大,数据量较大的时候,我们都会将项目部署到多台服务器上,这些个服务器都是分布在不同的区域,这样实现了项目的负载和并…

工作实践中如何使用ThreadLocal?

主要作用 多线程问题主要是多个线程共享一个对象导致的,我们不让他共享就行了,每个线程保存一份自己的对象,自己玩自己的对象,就不会出现线程问题了。 ThreadLocal这个作用就是让线程自己独立保存一份自己的变量副本。每个线程都…

自动驾驶学习笔记(十六)——目标跟踪

#Apollo开发者# 学习课程的传送门如下,当您也准备学习自动驾驶时,可以和我一同前往: 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo 社区开发者圆桌会》免费报名—>传送门 文章目录 前言 匹配关联 轨迹记录 状态预测 总结 前…

《Kafka权威指南》读书笔记

《Kafka权威指南》第一、三、四、六章,是重点。可以多看看。 一、 Kafka的组成 kafka是一个发布与订阅消息系统消息:kafka的数据单元称为"消息"。可以把消息看成是数据库中的一个"数据行"。 消息的key:为key生成一个一…