cas 登录之后不跳转_图解JWT如何用于单点登录

d4dee514c860c3cdbd0a085a91c0b3a0.png

点击上方“Java知音”,选择“置顶公众号”

技术文章第一时间送达!

作者:流云诸葛http://cnblogs.com/lyzg/p/6132801.html

推荐阅读(点击即可跳转阅读)

1. 淘宝服务端高并发分布式架构演进之路

2. IntelliJ IDEA 从入门到上瘾教程,2019图文版!

3. 高并发场景下缓存处理的一些思路

4. 权限设计的一些想法和思考

单点登录是我比较喜欢的一个技术解决方案,一方面他能够提高产品使用的便利性,另一方面他分离了各个应用都需要的登录服务,对性能以及工作量都有好处。

自从上次研究过JWT如何应用于会话管理,加之以前的项目中也一直在使用CAS这个比较流行的单点登录框架,所以就一直在琢磨如何能够把JWT跟单点登录结合起来一起使用,尽量能把两种技术的优势都集成到项目中来。本文介绍我从CAS思考得出的SSO的实现方案。

前言

其实CAS这个方案很好,非常强大,它最新的版本已经集成JWT了,所以要是不想自己开发单点登录的服务的话,完全可以考虑使用CAS。但是我认为,我们在做项目的时候,也许一开始并不需要这么强大的产品,CAS提供的登录形式有很多,而我们只需要应用其中的一种;

而且它这个框架正是因为强大,所以也会比较复杂,简单上手容易,但是遇到一些特殊的需求,比如我们想在CAS里面加入微信登录,那就需要对它的原理以及API有比较深入的了解才行。综合考虑,还是弄清楚CAS的原理,自己来实现一个基本的SSO服务比较放心。

本文的内容需要对JWT和SSO有一个基本的了解,你可以从这两篇文章来了解JWT的用途:

http://www.cnblogs.com/lyzg/p/6067766.htmlhttp://www.cnblogs.com/lyzg/p/6028341.html

还可以从下面的资料来了解SSO的内容:

https://baike.baidu.com/item/SSO/3451380?fr=aladdin

方案介绍

本文主要是通过时序图的方式来介绍JWT SSO的实现原理,具体的技术实现暂时还没有,不过当你理解了这个方案的原理后,你会觉得最终的实现并不会特别复杂,你可以用任意的平台语言来实现它。

下面的时序图,模拟了三个服务,分别是CAS、系统A、系统B,它们分别部署在http://cas.com,http://systemA.com和http://systemB.com;CAS这个服务用来管理SSO的会话;系统A和系统B代表着实际的业务系统。我从五个场景分别来说明这个SSO方案的实现细节。下面先来看第一个。

场景一:用户发起对业务系统的第一次访问,假设他第一次访问的是系统A的some/page这个页面,它最终成功访问到这个页面的过程是:

238d5e06f710a14d73051dd9c300c316.png

图片点击放大看,下同

在这个过程里面,我认为理解的关键点在于:

  1. 它用到了两个cookie(jwt和sid)和三次重定向来完成会话的创建和会话的传递;
  2. jwt的cookie是写在http://systemA.com这个域下的,所以每次重定向到http://systemA.com的时候,jwt这个cookie只要有就会带过去;
  3. sid的cookie是写在http://cas.com这个域下的,所以每次重定向到http://cas.com的时候,sid这个cookie只要有就会带过去;
  4. 在验证jwt的时候,如何知道当前用户已经创建了sso的会话?因为jwt的payload里面存储了之前创建的sso 会话的session id,所以当cas拿到jwt,就相当于拿到了session id,然后用这个session id去判断有没有的对应的session对象即可。

还要注意的是:CAS服务里面的session属于服务端创建的对象,所以要考虑session id唯一性以及session共享(假如CAS采用集群部署的话)的问题。session id的唯一性可以通过用户名密码加随机数然后用hash算法如md5简单处理;session共享,可以用memcached或者redis这种专门的支持集群部署的缓存服务器管理session来处理。

由于服务端session具有生命周期的特点,到期需自动销毁,所以不要自己去写session的管理,免得引发其它问题,到github里找开源的缓存管理中间件来处理即可。存储session对象的时候,只要用session id作为key,session对象本身作为value,存入缓存即可。session对象里面除了session id,还可以存放登录之后获取的用户信息等业务数据,方便业务系统调用的时候,从session里面返回会话数据。

场景二:用户登录之后,继续访问系统A的其它页面,如some/page2,它的处理过程是:

977d71293dd4681e3e1cab7f6b54022e.png

从这一步可以看出,即使登录之后,也要每次跟CAS校验jwt的有效性以及会话的有效性,其实jwt的有效性也可以放在业务系统里面处理的,但是会话的有效性就必须到CAS那边才能完成了。当CAS拿到jwt里面的session id之后,就能到session 缓存服务器里面去验证该session id对应的session对象是否存在,不存在,就说明会话已经销毁了(退出)。

场景三:用户登录了系统A之后,再去访问其他系统如系统B的资源,比如系统B的some/page,它最终能访问到系统B的some/page的流程是:

4afaa45b103a348078517c2d86d4cdc7.png

这个过程的关键在于第一次重定向的时候,它会把sid这个cookie带回给CAS服务器,所以CAS服务器能够判断出会话是否已经建立,如果已经建立就跳过登录页的逻辑。

场景四:用户继续访问系统B的其它资源,如系统B的some/page2:

6cb6c86bf17b59f3ea6395bc905582e1.png

这个场景的逻辑跟场景二完全一致。

场景五:退出登录,假如它从系统B发起退出,最终的流程是:

254bde45ef61c86d7aa7b528184f8dbe.png

最重要的是要清除sid的cookie,jwt的cookie可能业务系统都有创建,所以不可能在退出的时候还挨个去清除那些系统的cookie,只要sid一清除,那么即使那些jwt的cookie在下次访问的时候还会被传递到业务系统的服务端,由于jwt里面的sid已经无效,所以最后还是会被重定向到CAS登录页进行处理。

方案总结

以上方案两个关键的前提:

  1. 整个会话管理其实还是基于服务端的session来做的,只不过这个session只存在于CAS服务里面;
  2. CAS之所以信任业务系统的jwt,是因为这个jwt是CAS签发的,理论上只要认证通过,就可以认为这个jwt是合法的。

jwt本身是不可伪造,不可篡改的,但是不代表非法用户冒充正常用法发起请求,所以常规的几个安全策略在实际项目中都应该使用:

  1. 使用https
  2. 使用http-only的cookie,针对sid和jwt
  3. 管理好密钥
  4. 防范CSRF攻击。

尤其是CSRF攻击形式,很多都是钻代码的漏洞发生的,所以一旦出现CSRF漏洞,并且被人利用,那么别人就能用获得的jwt,冒充正常用户访问所有业务系统,这个安全问题的后果还是很严重的。考虑到这一点,为了在即使有漏洞的情况将损害减至最小,可以在jwt里面加入一个系统标识,添加一个验证,只有传过来的jwt内的系统标识与发起jwt验证请求的服务一致的情况下,才允许验证通过。这样的话,一个非法用户拿到某个系统的jwt,就不能用来访问其它业务系统了。

在业务系统跟CAS发起attach/validate请求的时候,也可以在CAS端做些处理,因为这个请求,在一次SSO过程中,一个系统只应该发一次,所以只要之前已经给这个系统签发过jwt了,那么后续 同一系统的attach/validate请求都可以忽略掉。

总的来说,这个方案的好处有:

  1. 完全分布式,跨平台,CAS以及业务系统均可采用不同的语言来开发;
  2. 业务系统如系统A和系统B,可实现服务端无状态
  3. 假如是自己来实现,那么可以轻易的在CAS里面集成用户注册服务以及第三方登录服务,如微信登录等。

它的缺陷是:

  1. 第一次登录某个系统,需要三次重定向(不过可以优化成两次);
  2. 登录后的后续请求,每次都需要跟CAS进行会话验证,所以CAS的性能负载会比较大
  3. 登陆后的后续请求,每次都跟CAS交互,也会增加请求响应时间,影响用户体验。

本文小结

本文从理论层面介绍了结合jwt来实现SSO的方案原理,希望它能帮助一些朋友更好的理解SSO以及它的实现方法。本文方案参考自CAS的实现流程,你可以从下面这个资料了解CAS的单点登录实现过程:

https://apereo.github.io/cas/4.1.x/protocol/CAS-Protocol.html

它的流程跟我这个差别不是特别大,但是从清晰层面来说,我写的还是要更明了一些,所以对比起来阅读,可能理解会更透彻些。

另外,这个方案考虑地不一定很全面,所以要是您发现了其中的问题,还请您帮忙指正,非常感谢。

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

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

相关文章

转:java网络编程-HTTP编程

转自: java网络编程-HTTP编程_Stillsings的博客-CSDN博客HTTP编程Java HTTP编程支持模拟成浏览器的方式去访问网页URL, Uniform Resource Locator,代表一个资源URLConnection获取资源连接器根据URL的openConnection()方法获得URL…

Centos7-通过RPM方式安装MySQL5.7

前言 Hallo,我们都知道开发时数据库是不可或缺的,本文就简单记录一下安装MySQL数据库的其中一种方式吧。 系统环境 系统:CentOS Linux 7.5 数据库版本:5.7 安装步骤 1. 从官网获取安装包 官方下载地址:https://ww…

python开发工具下所有软件都打不开_Python 开发工具链全解

可能刚开始学习Python时,有人跟你说可以将源文件所在的文件夹添加到 PYTHONPATH环境变量中,然后可以从其他位置导入此代码。在大多数情况下,这个人常常忘记补充这是一个非常糟糕的主意。有些人在互联网上发现了这一点,其他人却要看…

利用F#库canopy进行UI测试

虽然Selenium是一个流行的UI测试库,但基于它创建的测试却有着脆弱与不可靠等常见的问题。InfoQ与canopy的作者Chris Holt进行了一次访谈,以便更深入地了解canopy这个在Selenium的基础上所创建的F#库。 InfoQ:你能否为我们介绍一下canopy&…

转: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)

转自: Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解) - Java知音号 - 博客园RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。 我之前的HTTP开发是…

SpringBoot整合Shiro权限框架

前言 在系统管理中,权限是非常重要的一个环节。目前权限框架中使用比较多的有Shiro、Spring Security。🎃 本篇简单写一下SpringBoot整合Shiro权限框架小栗子🌰。 个人博客地址:SpringBoot整合Shiro权限框架 介绍Shiro Apache S…

Java开发必须掌握的8种网站攻防技术

转载自 Java开发必须掌握的8种网站攻防技术 XSS攻击 XSS攻击的全称是跨站脚本攻击(Cross Site Scripting),是WEB应用程序中最常见到的攻击手段之一。跨站脚本攻击指的是攻击者在网页中嵌入恶意脚本程序, 当用户打开该网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端…

转:json与map互转

转自: java中字符串,json,Map互相转换(各种转换都有)_蜗牛驿站-CSDN博客_java json转map前提:使用jar包为fastjsonimport com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject; 程序如下: …

专属微信二维码python制作_如何利用Python制作简单的公众号二维码关注图

创意配图:微信,微信公众号,微信大V 而且最近发现了一个新的图像处理方面的库—Wand,它是 ImageMagick 库的 Python 接口。于是,我就打算用这个库来实现简单的制作一个二维码关注图,主要是完成以下几个工作&…

如何迁移#SNMP到.NET Core平台的一些体会

.NET Core 依然在飞速进化中,所以如果不是非常喜欢折腾的性格,建议各位还是暂时忍耐。 准备阶段 首先,Visual Studio 2015是必要的开发工具。虽然它已经包含了.NET Core的原始测试版,这里还是推荐下载 RC1 安装包, htt…

JAVA实现一个图片上传预览功能

这个小项目主要使用java实现了一个简单的图片上传预览功能,废话不多说,先上实现成果 ^ _ ^💯 预览 登录页 主页 上传页 图片预览 项目架构 后端: SpringBoot shiro mybatis-plus druid hutool 前端: layui viewer 项目结构 ├─src├…

小程序执行运行过程原理_PLC的基础小知识!不用把PLC想的太难

PLC实质上是工业计算机,是计算机技术与传统继电接触器控制器技术相结合的产物,只不过比一般的计算机具有更强的与工业过程相连接的接口和更直接的适用于工业控制要求的编程语言。一、PLC的结构从硬件结构上看,PLC主要由中央处理单元(CPU)、存…

内部局域网可自行分配的ip地址

【1】有些ip地址很特殊 以 10. 、 172.16. 、172.31. 、192.168. 开头的所有ipv4地址都未分配。 更确切的说,这些地址不会被 ISP(Internet服务提供商)分配给广域网上的计算机,即无法加入全球Internet网络-广域网; 但…

以吃货的角度理解 IaaS,PaaS,SaaS 是什么

转载自 以吃货的角度理解 IaaS,PaaS,SaaS 是什么随着云计算时代的到来,越来越多的软件,开始采用云服务。越来越多的概念也随之而来。云服务只是一个统称,可以分成三大类。IaaS:基础设施服务,Inf…

.Net使用RabbitMQ详解

序言 这几天呢,公司风波再起,去年一年公司CTO换啦4任,CEO换啦三个,这不刚来个新老大,感觉还不错,却没干过3个月又要走,索性趁老大们走来走去的时候,就给自己空出来,稍稍总…

SpringBoot整合Redis要注意的那些

前言 昨天自己在重新学习SpringBoot整合Redis时,遇到了一个问题java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfig,错误很明显找不到需要的类。下面主要记录一下错误是怎么出线的,并且如何解决。 错…

Java之Socket与HTTP区别

转自: Java之Socket与HTTP区别 - 曹刚 - 博客园我们都知道TCP/IP协议共分四层:①链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他…

人人都能掌握的Java服务端性能优化方案

转载自 人人都能掌握的Java服务端性能优化方案 作为一个Java后端开发,我们写出的大部分代码都决定着用户的使用体验。如果我们的代码性能不好,那么用户在访问我们的网站时就要浪费一些时间等待服务器的响应。这就可能导致用户投诉甚至用户的流失。 关于性…

python模板模式_python-模板方法模式

说明: 模板方法模式时行为模式中比较简单的设计模式之一。模板方法关注这样的一类行为:该类行为在执行过程中拥有大致相同的动作次序,只是动作在实现的具体细节上有所差异。例如:泡茶和泡咖啡,泡茶:把水煮沸…

nacos启动失败:org.springframework.boot.web.server.WebServerExceptio

准备环境 系统环境: windows nacos: 2.0.0-BETA 错误信息 org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat 配置文件…