单点登录(一):思考

单点登录(后文简称:sso)的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统(摘自百度百科)。整个流程中涉及到的角色有:
  • 用户。
  • 应用服务器,即业务系统。
  • 单点登录服务器,所有业务系统登录的核心枢纽,后文简称用户中心。
关于token同步的思考
从其定义中不难发现,核心功能点:一处登录处处登录,注销亦然。那么如何实现一处登录处处登录,先抛开网上各种解决思路回到问题本身。用户中心登录成功后产生的token(或者说“票据”,后文统一称token)如果能够同步到各个业务系统,而各个业务系统能成功解析token后即可认为达到了一处登录处处登录。所以关键问题在于:
  1. 如何在用户中心登录成功后将token同步到各个业务系统。
  2. 各业务系统如何能够成功解析token。
其中各业务系统解析token很好解决,和用户中心约定一套公用的加密/解密方式即可。那么问题一,由于token的存储一般在于浏览器,而从用户中心服务器发起请求到各个业务系统是在浏览器端写不了token的。那么换种思路,在登录成功后从浏览器端向各个业务系统发起请求写入token。
关于登录功能使用的思考
而由于用户中心被许多业务系统所使用,各系统所使用的开发语言未必能完全统一,于是有功能点二:登录服务的调用应该是易用且与平台语言无关的。这个问题可按两种不同的思路来解决:
  1. 业务系统没有登录页面,直接跳转用户中心登录并将token同步至所有业务系统。
  2. 业务系统有登录页面,直接引用用户中心sso.js调用登录并将token同步至所有业务系统。
关于登录用户权限的思考
假定有业务系统A、B、C、D。用户1可登录系统A、B,用户2可登录系统B、C、D,于是有功能点三:用户中心应该可以控制用户所能登录的业务系统。在登录生成token时,加入能够登录的业务系统信息,在登录成功后,只向能够登录的业务系统发起同步token的请求,并且各业务系统在token解析后需要验证token是否具有当前系统的登录权限。
关于token刷新策略的思考
关于token的刷新策略,token应该什么时候刷新,在sso系统中,token刷新后又该如何通知到其他业务系统。第一个问题参考owin的cookie登录,在请求中,判断token是否超过有效期的一半,超过则刷新。第二个问题就麻烦了,因为token的刷新是跟随正常请求的,我们就不能再使用像登录那样依靠浏览器去通知所有业务系统了,关于这个问题,有三种解决思路:
  1. 各系统定时刷新token并通知各个业务系统。
  2. token只存于用户中心,向各个业务系统发放该token的key,各业务系统根据key向用户中心获取token并缓存,缓存的过期时间为是token下次应该刷新的时间。
  3. 共享一个分布式token存储系统,可使用redis,向各个业务系统发放token的key,需要刷新时直接使用key刷新redis中的token。
巴拉巴拉讲了一堆,也不知道大伙们能理解多少,权当记录我在开发过程中的一些思考吧,当然少不了大家喜闻乐见的GitHub地址:https://github.com/liuxx001/sso.git,下篇讲具体实现,最后先放个sso.js压压惊。
var sso = sso || {};
(function ($) {sso.host = "http://localhost:58806/";sso.utils = {isEmpty: function(str) {if (typeof (str) === "undefined") return true;if (str.replace(/(^s*)|(s*$)/g, "").length === 0) return true;return false;}};/*** 登录* @param {signInfo}登录信息*   {userName:"",password:"",rememberMe:false,returnUrl:""}*/sso.login = function(signInfo) {if (sso.utils.isEmpty(signInfo.userName)) {alert("用户名不能为空");return;}if (sso.utils.isEmpty(signInfo.password)) {alert("登录密码不能为空");return;}$.ajax({url: sso.host + "Account/SignIn",dataType: 'jsonp',type: 'GET',contentType: 'application/json',data: signInfo});};/*** 三方登录* @param {signInfo}登录信息*   {loginProvider:"",providerKey:"",rememberMe:false,returnUrl:""}*/sso.externalLogin = function(signInfo) {if (sso.utils.isEmpty(signInfo.loginProvider)) {alert("三方登录来源不能为空");return;}if (sso.utils.isEmpty(signInfo.providerKey)) {alert("三方登录唯一Key不能为空");return;}$.ajax({url: sso.host + "Account/ExternalSignIn",dataType: 'jsonp',type: 'GET',contentType: 'application/json',data: signInfo});};/*** 注销*/sso.logOut = function() {$.ajax({url: sso.host + "Account/SignOut",dataType: 'jsonp',type: 'GET',contentType: 'application/json',data: {}});};/*** sso服务器登录成功后jsonp回调* @param {string[]}需要通知的Url集合*/sso.notify = function () {var createScript = function (src) {$("<script><//script>").attr("src", src).appendTo("body");};var urlList = arguments;for (var i = 1; i < urlList.length; i++) {createScript(urlList[i]);}//延时执行,避免跳转时cookie还未写入成功setTimeout(function () {if (urlList[0] === "refresh") {window.location.reload();} else {window.location.href = urlList[0];}}, 1000);};/*** sso服务器登录失败后jsonp回调* @param {code}错误码* @param {msg}错误消息*/sso.error= function(code, msg) {alert(msg);}
})(jQuery);

 

转载于:https://www.cnblogs.com/liuyh/p/6775089.html

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

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

相关文章

热电偶校验仪_热电偶校验方法_热电偶的使用方法及维修经验

一、遵照仪表接线图进行准确接线通电后&#xff0c;仪表先是显示仪表的热电偶分度号&#xff0c;接着显示仪表量程范围&#xff0c;再测仪表显示设定温度&#xff0c;数显仪表显示测量温度。若仪表数码管显示不是发热体的温度&#xff0c;而显示“OVER”、“0000”或“000”等状…

linux svn checkout密码,linux的svn之checkout命令

linux的checkout命令是linux的svn的常用命令之一。下面由秋天网 Qiutian.ZqNF.Com小编为大家搜集整理了linux的svn之checkout命令的相关知识&#xff0c;希望对大家有帮助!linux的svn之checkout命令常用检出命令&#xff1a;svn co http://路径(目录或文件的全路径) [本地目录…

Java 7:满足Fork / Join框架

JSR-166&#xff08;y&#xff09;是Java 7中包含的此新功能的正式名称。如果您发现名称中有一个“ y”&#xff0c;这是因为自Java 5起就添加了JSR-166&#xff08;并发实用程序&#xff09; &#xff0c;但它不会就此停止&#xff0c;因为已经有计划在JSR-166&#xff08;e&a…

css3总结之居中

居中在前端布局上很常见&#xff0c;也很常用&#xff0c;也是最基本的技巧。居中效果在方向控制上基本可以分解成水平居中&#xff0c;垂直居中和水平垂直居中。 针对调整的元素不同&#xff0c;具体的处理方式上有些差异。这里我们先不讲绝对定位下的居中&#xff0c;绝对定位…

PHP进程及进程间通信

一、引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。换句话说就是&#xff0c;在系统调度多个cpu的时候&#xff0c;一个程序的基本单元。进程对于大多数的语言都不是一个陌生的概念&#xff0c;作为"世界上最好的语言PHP"当然也例外。 二、环境…

福州java培训哪里好_南通java培训哪家好

渡课IT教育成立于2006年&#xff0c;14年来&#xff0c;我们累计输送学员达 6000 &#xff0c;其中南通地区输送50%&#xff0c;上海 40%&#xff0c;其他地区 10%&#xff0c;学员1年后的平均薪水达 9860 元&#xff1b;受到1000用人单位的赞誉与支持。Java开发的需求量在北上…

Linux 服务器注意事项

1.创建时 数据文件一定分盘挂载 2.LVM 虚拟磁盘卷是否创建 有争议&#xff1f;&#xff1f;&#xff1f;3.hosts 文件 最好添加本机映射 主机名 127.0.0.1 4.iptables 开启转载于:https://www.cnblogs.com/centos2017/p/7896681.html

linux 查看下挂磁盘,linux下磁盘挂载与查看

df查看系统分区和使用情况使用方法&#xff1a;df-h(自动按照大小做单位适应显示)df-i(查看iNode使用情况)free查看..LABELdefaults默认选项&#xff1a;rw (可读写)sudi (加此选项后则该分区可为文件加s权限&#xff1b;如不需要则写为nosuid)dev(可以解析该分区下的块…

研究僵局–第2部分

调查死锁时最重要的要求之一就是要研究死锁。 在我的上一个博客中&#xff0c;我编写了一个名为DeadlockDemo代码&#xff0c;该代码使用一堆线程在一系列银行帐户之间转移随机数&#xff0c;然后陷入僵局。 该博客运行该代码以演示获取线程转储的几种方法。 线程转储只是一个…

从0开始接触html--第一天学习内容总结

第一天 总结: h1-h6 p 段落 hr br有序 ol li 无序 ul li 定义列表 dl dt dd块级元素&#xff1a;独占一行&#xff0c;h1-h6 p hr div行内元素&#xff1a;共占一行, em和i strong和b u del和s span块级分区元素&#xff1a;div header nav article footer行内分区元素&#…

连锁便利店管理系统有什么用

连锁便利店管理系统对于连锁便利店的运营和管理非常有用。以下是一些常见的用途&#xff1a; 1. 库存管理&#xff1a;连锁便利店通常需要管理多个门店的库存&#xff0c;管理系统可以帮助实时掌握各个门店的库存情况&#xff0c;包括商品数量、进货记录、库存调拨等。这样可以…

经常使用meta标签属性

《meta》 1.Keywords (keyword)说明&#xff1a;告诉搜索引擎你网页的keyword是什么。 使用方法&#xff1a;<meta name"keywords" content"SEO优化,SEO优化教程,站点优化,搜索引擎优化教程"> 2. Description (网页描写叙述)说明&#xff1a;Descrip…

浏览器打印设置横向打印_爱普生打印机无线连接设置

1、首先&#xff0c;把epsonl385打印机插上电源通电&#xff0c;待自检完成后&#xff0c;便可以设置。如果用户家里的无线路由器带有WPS(Wi-Fi Protected Setup)或QSS(又称快速安全设置)功能&#xff0c;那就简单多了。2、通过WPS或QSS无线路由器按钮连接&#xff0c;给无线路…

linux python定时任务调度,Python下定时任务框架APScheduler的使用

1.APScheduler简介&#xff1a;APScheduler是Python的一个定时任务框架&#xff0c;可以很方便的满足用户定时执行或者周期执行任务的需求&#xff0c;它提供了基于日期date、固定时间间隔interval 、以及类似于Linux上的定时任务crontab类型的定时任务。并且该框架不仅可以添加…

图片和文件上传js剖析

/** * 商户资质信息模块js * * 涉及页面组件 { * 上传组件&#xff08;UploadFileComponent&#xff09; * } * * * 初始化工具&#xff08;init&#xff09; * * Author:Waver */var qualificationInfoModule (function() { // 上传文件类型 var UPLOAD_FILE_TYPE…

研究僵局–第1部分

我敢肯定我们都去过那里&#xff1a;太晚了&#xff0c;您饿了&#xff0c;服务器已挂起&#xff0c;或者应用程序正在以蜗牛的速度运行&#xff0c;并且有人喘着气想要您解决问题&#xff0c;然后再去解决。 您的应用程序意外挂起的可能原因之一是称为死锁的线程问题。 无需赘…

前端的学习之旅

Html学习笔记1 特殊符号&#xff1a;html中对换行缩进空格不敏感&#xff0c;都只会解析成一个空格 空格&#xff1a; < : < > :$gt; 版权符号&#xff1a;&copy&#xff1b; 表格&#xff1a;1 表示表格&#xff1a;table表示表格 tr&#xff1a;…

使用Vue.js和Axios从第三方API获取数据 — SitePoint

更多的往往不是&#xff0c;建立你的JavaScript应用程序时&#xff0c;你会想把数据从远程源或消耗一个[ API ]&#xff08;https&#xff1a;/ /恩。维基百科。org /维基/ application_programming_interface&#xff09;。我最近看了一些[公开]&#xff08;https://github.co…

区位码怎么知道点阵里的起始点_自身免疫疾病的GAPS起始饮食改良版

写这篇文章的原因如果您已经关注我的博客一段时间&#xff0c;您知道我开始使用GAPS饮食&#xff0c;然后转换到AIP饮食&#xff0c;因为我仍在努力治疗炎症和自身免疫的发作。 Katy Haldiman 有同样的经历&#xff0c;我们并不孤单。许多患有自身免疫性疾病的人在 GAPS 上挣扎…

Linux存储保护,谈谈Linux中的存储保护

谈谈Linux中的存储保护以下讨论的内容是以i386平台为基础的Linux将4G的地址划分为用户空间和内核空间两部分。在Linux内核的低版本中(2。0。X)&#xff0c;通常0-3G为用户空间&#xff0c;3G-4G为内核空间。这个分界点是可以可以改动的。正是这个分界点的存在&#xff0c;限制了…