diff --git a/java/springboot系列/spring boot SSO单点登录.md b/java/springboot系列/spring boot SSO单点登录.md deleted file mode 100644 index 3b3a7a0..0000000 --- a/java/springboot系列/spring boot SSO单点登录.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: '2019-03-01-18-52' -date: '2019/03/01 18:52' -title: 'spring boot 基于JWT实现单点登录' -tags: ['spring-boot', 'SSO', '单点登录', 'jwt'] -categories: - - 'java' - - 'spring boot学习' ---- - -**本篇原创发布于:**[FleyX 的个人博客](http://tapme.top/blog/detail/2019-03-01-18-52) - -照例配个图: -![塞尔达,林克](https://raw.githubusercontent.com/FleyX/files/master/blogImg/20190301190816.png) - -
看我大塞尔达,不!是林克
- -  最近我们组要给负责的一个管理系统 A 集成另外一个系统 B,为了让用户使用更加便捷,避免多个系统重复登录,希望能够达到这样的效果——用户只需登录一次就能够在这两个系统中进行操作。很明显这就是**单点登录(Single Sign-On)**达到的效果,正好可以明目张胆的学一波单点登录知识。 - -本篇主要内容如下: - -- SSO 介绍 -- SSO 的几种实现方式对比 -- 基于 JWT 的 spring boot 单点登录实现 - -**注意:** -  SSO这个概念已经出现很久很久了,目前各种平台都有非常成熟的实现,比如`OpenSSO`,`OpenAM`,`Kerberos`,`CAS`等,当然很多时候成熟意味着复杂。本文不讨论那些成熟方案的使用,也不考虑SSO在CS应用中的使用。 - -# 什么是SSO - -   \ No newline at end of file diff --git a/java/springboot系列/web跨域相关问题.md b/java/web相关/1.web跨域相关问题.md similarity index 100% rename from java/springboot系列/web跨域相关问题.md rename to java/web相关/1.web跨域相关问题.md diff --git a/java/web相关/2.spring boot SSO单点登录.md b/java/web相关/2.spring boot SSO单点登录.md new file mode 100644 index 0000000..8dd6265 --- /dev/null +++ b/java/web相关/2.spring boot SSO单点登录.md @@ -0,0 +1,67 @@ +--- +id: '2019-03-01-18-52' +date: '2019/03/01 18:52' +title: 'spring boot 基于JWT实现单点登录' +tags: ['spring-boot', 'SSO', '单点登录', 'jwt'] +categories: + - 'java' + - 'spring boot学习' +--- + +**本篇原创发布于:**[FleyX 的个人博客](http://tapme.top/blog/detail/2019-03-01-18-52) + +照例配个图: +![塞尔达,林克](https://raw.githubusercontent.com/FleyX/files/master/blogImg/20190301190816.png) + +
我叫林克,不是塞尔达
+ +  最近我们组要给负责的一个管理系统 A 集成另外一个系统 B,为了让用户使用更加便捷,避免多个系统重复登录,希望能够达到这样的效果——用户只需登录一次就能够在这两个系统中进行操作。很明显这就是**单点登录(Single Sign-On)**达到的效果,正好可以明目张胆的学一波单点登录知识。 + +本篇主要内容如下: + +- SSO 介绍 +- SSO 的几种实现方式对比 +- 基于 JWT 的 spring boot 单点登录实战 + +**注意:** +  SSO这个概念已经出现很久很久了,目前各种平台都有非常成熟的实现,比如`OpenSSO`,`OpenAM`,`Kerberos`,`CAS`等,当然很多时候成熟意味着复杂。本文不讨论那些成熟方案的使用,也不考虑SSO在CS应用中的使用。 + +# 什么是SSO + +  单点点说就是:一次登录后可免登陆访问其他的可信平台。比如我们登录淘宝网后,再打开天猫首页可以发现已经是登录状态了。SSO是一种比较流行的服务于企业业务整合的一种解决方案。 + +# 如何实现SSO + +  我们都知道目前的http协议是无状态的,也就是第一次请求和第二次请求是完全独立,不相关的,但现实中我们的业务逻辑都是有状态的,这样就引入了cookie-session的机制来维护状态,浏览器端存储一个sessionId,后台存储跟该sessionId相关的数据。每次向后台发起请求时都携带此sessionId就能维持状态了。然后就有了cookie,浏览器在发送请求时自动将cookie中的数据放到请求中,发给服务端,无需手动设置。 + +  然后我们可以考虑考虑实现SSO的核心是什么?答案就是如何让一个平台A登录后,其他的平台也能获取到平台A的登录信息(在cookie-session机制中就是sessionId)。 + +## 方案一 共享cookie + +  基于cookie-session机制的系统中,登录系统后会返回一个sessionId存储在cookie中,如果我们能够让另外一个系统也能获取到这个cookie,不就获取到凭证信息了,无需再次登录。刚好浏览器的cookie可以实现这样的效果(详见[web跨域及cookie学习](http://tapme.top/blog/detail/2019-03-05-13-41))。 + +  cookie允许同域名(或者父子域名)的不同端口中共享cookie,这点和http的同域策略不一样(http请求只要协议、域名、端口不完全相同便认为跨域)。因此只需将多个应用前台页面部署到相同的域名(或者父子域名),然后共享session便能够实现单点登录。架构如下: + +![共享session架构](https://raw.githubusercontent.com/FleyX/files/master/blogImg/20190307185148.png) + +  上面方案显而易见的限制就是不仅前台页面需要共享cookie,后台也需要共享session(可以用`jwt`来干掉session,但是又会引入新的问题,这里不展开).这个方案太简单了,不作进一步说明。 + +## 方案二 基于回调实现 + +  通过上文可以知道,要实现单点登录只需将用户的身份凭证共享给各个系统,让后台知道现在是`谁`在访问。就能实现一次登录,到处访问的效果,实在是非常方便的。在session机制中是共享sessionId,然后多个后台使用同一个session源即可。这里我们用一种新的基于JWT的token方式来实现,不了解JWT的可以看这篇:[java-jwt生成与校验](http://www.tapme.top/blog/detail/2019-02-28-15-50),简单来说jwt可以携带无法篡改的信息(一段篡改就会校验失败),所以我们可以将用户id等非敏感信息直接放到jwt中,干掉了后台的session。然后我们要做的就是将jwt共享给各个平台页面即可。系统架构如下: + +![基于jwt的回调](https://raw.githubusercontent.com/FleyX/files/master/blogImg/20190307185751.png) + +  此架构中,业务系统A和业务系统B之间不需要有任何联系,他们都只和SSO认证平台打交道,因此可以任意部署,没有同域的限制。你可能就要问了这样要怎么共享身份凭证(也就是jwt字符串)?这里就要通过url参数来进行骚操作了。文字总结来说是这样的:jwt存到认证平台前端的localStore(不一定是localStore,cookie,sessionStore都可以),然后业务平台携带自己的回调地址跳转到认证中心的前台,认证中心的前台再将ujwt作为url参数,跳回到那个回调地址上,这样就完成了jwt的共享。 + +  文字很可能看不懂,下面是整个过程的路程图: + +![流程图](https://raw.githubusercontent.com/FleyX/files/master/blogImg/20190307193904.png) + +相信通过上面的流程图你应该能大概看明白,jwt是如何共享了的吧,还看不懂的继续看下来,下面上一个spring boot实现的简易SSO认证。主要有两个系统:SSO认证中心,系统A(系统A换不同端口运行就是系统A、B、C、D了). + +## 实战 + +### 实现SSO认证中心 + +  spring boot框架先搭起来,由于是简易项目,只需要如下依赖: diff --git a/java/web相关/file/jwt共享架构如下 b/java/web相关/file/jwt共享架构如下 new file mode 100644 index 0000000..e6faeea --- /dev/null +++ b/java/web相关/file/jwt共享架构如下 @@ -0,0 +1 @@ +5VjbjpswEP0aP2aFuQTyuCRkW2mrrhS13X10wQFWgJHjbKBfXxPGEEJJaRWFVfuUmeMZX+Z4ZkyQsUyLB07y6BMLaIJ0LSiQsUK6jrFlyp8KKWtkroCQxwEYtcAm/kEB1ADdxwHddQwFY4mI8y7osyyjvuhghHN26JptWdJdNSch7QEbnyR99FsciKhGDUPT2oEPNA4jWFoOLeqRlChrMN1FJGCHE8jwkLHkjIlaSoslTaroqcDUfuuB0WZnnGZijAN5zB3t4fXLwfKjkohAfPyKZzbsTZTqxJzts4BWPhoyXMZFxEKWkeSRsVyCWIKvVIgSuCJ7wSQUiTSBUbkdXj6D/1F5qZQ73VL6qjgdXZVKK2LxrCaRcu1mgdY6VYryqbdPgx6LbVQA2rE99+mFUKjrRXhIxQU7o+FO3nrKUirPIP04TYiI37r7IHD9wsauJUgKwNEf8AXzvpFkDyshz0augVz3KLhosb5H+jyRJ3C/cymFognTCcsnfMGMlAtaXA5i/9DgoNtwxyHL8QL0Q5sz2AEsOkkXZXf1OOn9OJ2HQOZjXok+S3OWHU9a32yV6I4CmgQ3x4ZrmLvBGOJexPRfBExho28brPfEYrm3ZrGZbncIs7sTsO12J3PgnIRm03/Pi9OjocrdDaiZ5EGG+HolCHdLkD22BM20Ow2f1SHbuViJKuWJ8lhGiPLrVydjZHUauGQ3qk7apPSOZVf1IuAWX+R1Ag6tKTk0epVzs/mMPAfde+jePApr5GDkWchdVJ1HCs4audrNu87c7HYdffKuY77DrjPwXPmvus7itmXp7OH7265zxRJjjSwxkz5irX6a9B6x7uSPWBNPXU7m77CcDPSmf6ScSLX9IK/N2/81DO8n \ No newline at end of file diff --git a/java/web相关/file/jwt时序图 b/java/web相关/file/jwt时序图 new file mode 100644 index 0000000..933bd67 --- /dev/null +++ b/java/web相关/file/jwt时序图 @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/java/web相关/file/共享session架构 b/java/web相关/file/共享session架构 new file mode 100644 index 0000000..396d711 --- /dev/null +++ b/java/web相关/file/共享session架构 @@ -0,0 +1 @@ +7Vpds5s2EP01enTHIL70CMZOO5Ommdx2kjxyQbZpMHJl+Su/vishwNhwQxLfQObmxZZWWkl79uggYSM825xe8Wi7/pMlNEPmNDkhHCLTNDCx4EtazoXF8bRhxdNEd6oND+lnqo1Tbd2nCd01OgrGMpFum8aY5TmNRcMWcc6OzW5LljVn3UYremN4iKPs1vo+TcS6sGI8ndYNv9N0tdZTQxMpWjZR2Vt33a2jhB0vTHiO8IwzJorS5jSjmUSvBKbwW3S0VivjNBd9HN5458kff5HH45t/0klofTx8OvCJ4RbDHKJsr0PWqxXnEgPO9nlC5ShThIPjOhX0YRvFsvUIWQfbWmwyqBlQ1MNRLuipc6FGFT4Qh7INFfwMXUqHEjHNGVtXjxcJKPFfX2DvlKSJdNJX1dA1LFDQyHwNSuQGFJoAT3Q1Zzl8BU2cGBdrtmJ5lL1mbKvR+ZcKcdYsj/aCtWEnR34aOVgI2/OYPrVivVcivqLiiX64PROcZpFID8113B/WW+7NXRRgFASqECCy8NHcRh5BXqgKCxRAkp0MYgoeOZRWogLuIjt3JqTXJKTh3jKy6nPJSPJchDS/vGtBbrayGLPNFvgpIy3oV+qYVxoq/bL6wtWdzW4MbxAzWwArbb35p+d7y1JYWzXZxHQbCXObA7Dlcge74joJ1aK/g9HWF9TzG1QBUOfnD9pfVT5eVkIZs2NXVRmyJKOuv6U8hago1z531BjcU2OMQUUG9xUZ2KzefDiRcbAxMpGxRigyHVR6USJTHSh/mtOI3VcpOrbIj1EKu4dSBCM8jmBzaKVwRqgU9i+lmFQb9HmVouOE8pvdOKNMG0eUO59F3J4KQ4YUmJa79o3AzEYoMJYztMB4IxQY95fATAxnSIEZ/gpE+h5sBr0Ckb66M7IrkDX4Fah8ozgq4el4hr0s4bFv8jCmC893X2Ta4TamV6/GsX3F/EKJtNszwN7nlW0wQinBxuBSYo5QSrp4+rK0pOUVoebrkqkV1ily/tuzsmGyU0riQweDbE91Y8nxHd3tUpbLXeCHiHhqO5jI98rhYbnFDB17QqY0jaPMz9JVDiYhlSyIdC2jSzXLNorTfPW3UjmvNrxWzaFZW97pnBnKVnJt/yjPaEUsoSG1M0k5jYVcOQ5B6mTuVcDlsc66/09+18Jmej33a/Vj4f03bNulo8hbkh5aWQEAiIlOj6SFytANLcpRICt5L3LhNnK13BPnBPkGCmxZICHyTcU8C3kWmlso8JUie8gDtQ51E1kodxsFhu7j17R1EfGVsys9fdUVBgV/2dWTpJ5jBFnxzAtGF2E1QwWzwqxpHQ2MC+T7EhnfQZ6hg4OwdJR+G7CADVEPPVuCSeyLZx7kYoa84kA9k7tdN83aRnbksLAAOTvAXHQmyqvCGD7nKFio2V1Z1ilzVB945DptK4SmwstRXooesB45O7g7ijkO8mfSsSWcb0vslYDJTDbFYic4+0RnLGO8viAu0yy7MpUiF4OCyJtbcK2FmzRJ5DStf0hongXvIVB2U5/abiakRZ7cr1cnqNZ/CimecfV/a/D8fw== \ No newline at end of file diff --git a/java/其他/java-jwt生成与校验.md b/java/其他/java-jwt生成与校验.md index de5f9ad..141fe3e 100644 --- a/java/其他/java-jwt生成与校验.md +++ b/java/其他/java-jwt生成与校验.md @@ -8,7 +8,7 @@ categories: - 'java工具集' --- -**本篇原创发布于:**[FleyX 的个人博客](http://tapme.top/blog/detail/2019-02-28-15-50) +**本篇原创发布于:**[FleyX 的个人博客](http://www.tapme.top/blog/detail/2019-02-28-15-50) # 什么是 JWT