add:sso单点登录
This commit is contained in:
parent
b71e776832
commit
011960a2f4
31
go/基础/1.基础数据结构.md
Normal file
31
go/基础/1.基础数据结构.md
Normal file
@ -0,0 +1,31 @@
|
||||
---
|
||||
id: '2019-03-08-15-50'
|
||||
date: '2019/03/08 15:50'
|
||||
title: 'go基本数据类型'
|
||||
tags: ['go', 'var', '基础']
|
||||
categories:
|
||||
- 'go'
|
||||
- '基础'
|
||||
---
|
||||
|
||||
![](https://raw.githubusercontent.com/FleyX/files/master/blogImg/20190308185123.png)
|
||||
|
||||
**本文原创发布于:**[fleyX 的个人博客](www.tapme.top/blog/detail/2019-03-08-15-50)
|
||||
|
||||
  开始学习 go 喽。第一段代码必须是 hello world。
|
||||
|
||||
```go
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main(){
|
||||
fmt.Print("Hello,World")
|
||||
}
|
||||
```
|
||||
|
||||
下面正式开始 go 的入门!
|
||||
|
||||
## 包的使用
|
||||
|
||||
  每个Go程序都是由包组成的。
|
@ -10,6 +10,8 @@ categories:
|
||||
|
||||
**本篇原创发布于:**[FleyX 的个人博客](http://tapme.top/blog/detail/2019-03-01-18-52)
|
||||
|
||||
**源码:**[github](https://github.com/FleyX/demo-project/tree/master/1.SSO%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95)
|
||||
|
||||
照例配个图:
|
||||
![塞尔达,林克](https://raw.githubusercontent.com/FleyX/files/master/blogImg/20190301190816.png)
|
||||
|
||||
@ -64,4 +66,63 @@ categories:
|
||||
|
||||
### 实现 SSO 认证中心
|
||||
|
||||
  spring boot框架先搭起来,由于是简易项目,只需要如下依赖:
|
||||
  spring boot 框架先搭起来,由于是简易项目,除 spring boot web 基本依赖,只需要如下的额外依赖:
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-data-redis</artifactId>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>com.alibaba</groupId>
|
||||
<artifactId>fastjson</artifactId>
|
||||
<version>1.2.4</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.auth0</groupId>
|
||||
<artifactId>java-jwt</artifactId>
|
||||
<version>3.7.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
完整的 POM 文件,请到 github 上查看.
|
||||
|
||||
#### 后台实现
|
||||
|
||||
  后台做的事情并不多,只有以下 5 个方法:
|
||||
|
||||
- `/login` : 登录成功后签发一个 jwt token<br/>在 demo 中只是简单对比用户名密码如果是一样的认为登录成功,返回 token
|
||||
- `/checkJwt` : 检查 jwt 的有效性<br/>检查传来的 jwt-token 是否有效,返回失效的 jwt 列表
|
||||
- `/refreshjwt` : 刷新 jwt<br/>判断该 jwt 是否快要过期,如果快要过期,生成一个新的 jwt 返回
|
||||
- `/inValid` : 让某个 jwt 失效<br/>jwt 如何失效一直是一个比较麻烦的问题,各有利弊。本例中采用的是为每个 jwt 生成一个随机的秘钥 secret,将 jwt--secret 保存到 redis 中,想要让某个 jwt 失效,只需将该记录在 redis 中删除即可(这样在解密时便无法获取到 secret)。但是这样让无状态的认证机制变成有状态了(记录了 jwt 和 secret 的对应关系)。
|
||||
|
||||
  总结来说 SSO 后台主要只做了两件事:验证用户名密码返回 jwt;验证 jwt 是否合法。具体代码查看 github 上 sso 目录下的代码。
|
||||
|
||||
#### 前台实现
|
||||
|
||||
  前台的逻辑较为复杂,不是那么容易理解,(给我们组前台讲了半天还是不能理解,我也是醉了)。不明白的多看几遍上面的流程图。
|
||||
|
||||
  再次回到 SSO 的重点:分享登录状态。要如何在前台将登录状态(在这里就是 jwt 字符串)分享出去呢?由于浏览器的限制,除了 cookie 外没有直接共享数据的办法。既然没有直接共享,那肯定是有间接的办法的!
|
||||
|
||||
  这个办法就是**回调**。系统 A 的前台在跳转到 SSO 的前台时,将当前路径作为 url 参数传递给 sso 前台,sso 前台在获取到 jwt 后,再跳转到系统 A 传过来的 url 路径上,并带上 jwt 作为 url 参数。这就完成了 jwt 的一次共享,从 sso 共享到系统 A。
|
||||
|
||||
打个比方:你点了个外卖,别人要怎么把外卖给你呢?显然你会留下的地址,让别人带上饭送到这个地址,然后你就能享用美食了。这和jwt的传递非常相识了。
|
||||
|
||||
系统A说:我要jwt,快把它送到http://localhost:8081/test1/这个地址上。
|
||||
|
||||
SSO说:好嘞,这个地址是合法的可以送jwt过去,这就跳转过去:http://localhost:8081/test1/?jwt=abcdefj.asdf.asdfasf
|
||||
|
||||
系统A说:不错不错,真香。
|
||||
|
||||
  要注意这里**有个坑**就是:如果另外一个恶意系统C安装相同的格式跳转到SSO,想要获取jwt,这显然是不应该给它的。所以在回跳回去的时候要判断一下这个回调地址是不是合法的,能不能给jwt给它,可以向后台请求判断也可以在sso前台直接写死合法的地址。在demo是没有这个判断过程的。
|
||||
|
||||
# 效果
|
||||
|
||||
  上面说了一大串都是原理了,其实这个难也就难在原理部分,代码实现并没有那么复杂。这里就不贴代码了,有需要直接到github上看。
|
||||
|
||||
  这里上个效果图:
|
||||
|
||||
|
||||
可以看到,在系统A登录系统后,系统B,系统C都不再需要输入用户名密码进行登录。如果速度足够快甚至都注意不到调到SSO再跳回来的过程。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user