开胃:Oauth2认证流程分析

现在第三方登录已经很普遍了,随便哪个App都会有使用微信登录,使用手机号码登录,或者使用支付宝登录等功能...

下面我们就以使用微信登录,做一个简单的流程分析分析

开胃:JWT认识

在上面的Oauth2的认证流程中,我们就可以看出一些猫腻来:

  • 在我们拿着令牌去用户信息系统调用用户的相关信息的时候,

  • 用户信息系统其实去请求了授权服务器,验证l了该令牌的合法性

这样每次认证都需要去调用授权服务器做一个令牌合法性验证,显得效率低下。

JWT令牌思想

JWT令牌场景运用

之前返回的令牌就是一个普通的令牌,使用了JWT之后,这个令牌彷佛变得有点意思了起来

  • 用户在授权服务器通过之后,会得到一个JWT令牌;

  • 这个令牌中就已经包含了用户相关的信息;

  • 客户端只需要携带该JWT令牌访问资源服务器即可;

  • 资源服务器会按照约定的算法自动完成令牌的校验,这就就不用再去请求授权服务器了

流程我相信大家都已经看懂了,下面我们就来一点文的,解释一下JWT

JWT简单介绍

Json Web Token:JWT一共包含了三部分数据,这三部分数据通过.分割拼接而成的字符串,如:xxx.yyy.zzz

1.Header:头部【JSON】,通常头部有两部份信息,我们可对头部信息进行base64加密解密得到头部信息

  • 声明类型,这是一个JWT

  • 声明加密算法:自定义(HMAC / RSA /...)

  • 如下所示模样,

  • {
    "typ": "JWT",
    "alg": "HS256"
    }

2.payload【JSON】:载荷,就是我们要寄存的数据,一般包含一下信息

  • 用户身份信息(采用bases加密,可解密,不建议存放过于敏感的信息)

  • 注册声明:如该token的签发时间,过期时间(exp),签发人(iss)等信息

  • 如下所示模样:

  • {
    "name": "456",
    "admin": true
    }

3.Signature:签名,是整个数据的认证信息,

一般根据前两部的数据再加上服务器上的密钥通过加密算法生成,用于验证整个数据的完整性和可靠性

  • 如下所示模样:

  • HMACSHA256(
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    secret)
  • base64UrlEncode(header) :令牌的头部分

  • base64UrlEncode(payload):令牌的载荷

  • secret :签名所使用的密钥

看到这里,脑子里一现,是不是可以实现单点登录哦?就用载荷保存用户的唯一id,其他服务岂不是就可以获得用户信息?

Spring Security + JWT的Demo

项目介绍

  • 这里或许你就会有疑问了?为什么上面我们说了Oauth2,这里却不小试牛刀呢?

  • 因为 Oauth2一般运用与分布式项目中,需要单独起一个服务做鉴权服务,而我并没有想去搭建一套SpringCloud的想法

  • 所以这里就借着网上的一点小资料,代码也是模仿的别人的,我对它进行吸收并做下学习笔记顺便分享出来

pom文件指定相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.ninja.study</groupId>
<artifactId>security_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Ninja-Security</name>
<description>鞋破露脚尖儿</description>

<properties>
<java.version>1.8</java.version>
</properties>

<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.10.7</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.10.7</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

application.yml配置

更正一下,mysql的驱动类后面更换为了:com.mysql.cj.jdbc.Driver 望周知!

Code:GitHub见

不好理解的地方做了特别详细的说明,大家学习可自行下载即可:

GitHub

项目说明望周知

自测结果先说明一下:

注册用户

用户登录:

用户带着token去访问服务

然后就是项目源码说明:TODO 观看大体上的说明即可,比较难理解的我都是一行一行给了备注的

.

Spring Security + JWT学习的更多相关文章

  1. Spring Security + JWT实现前后端分离权限认证

    现在国内前后端很多公司都在使用前后端分离的开发方式,虽然也有很多人并不赞同前后端分离,比如以下这篇博客就很有意思: https://www.aliyun.com/jiaocheng/650661.ht ...

  2. Spring Boot整合实战Spring Security JWT权限鉴权系统

    目前流行的前后端分离让Java程序员可以更加专注的做好后台业务逻辑的功能实现,提供如返回Json格式的数据接口就可以.像以前做项目的安全认证基于 session 的登录拦截,属于后端全栈式的开发的模式 ...

  3. 基于Spring Boot+Spring Security+JWT+Vue前后端分离的开源项目

    一.前言 最近整合Spring Boot+Spring Security+JWT+Vue 完成了一套前后端分离的基础项目,这里把它开源出来分享给有需要的小伙伴们 功能很简单,单点登录,前后端动态权限配 ...

  4. Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二)

    Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二) 摘要 上一篇https://javaymw.com/post/59我们已经实现了基本的登录和t ...

  5. Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一)

    标题 Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一) 技术 Spring Boot 2.Spring Security 5.JWT 运行环境 ...

  6. 4-12 Spring Security + JWT

    Spring Security + JWT 此前,在处理登录的业务中,当视为登录成功时,返回的字符串并不是JWT数据,则应该将此数据改为必要的JWT数据. @Service public class ...

  7. springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

  8. 【项目实践】一文带你搞定Spring Security + JWT

    以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...

  9. Spring Security Jwt Token 自动刷新

    token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...

随机推荐

  1. 【原理】scan

    SCAN 命令的保证(guarantees) 同一个元素可能会被返回多次. 处理重复元素的工作交由应用程序负责, 比如说, 可以考虑将迭代返回的元素仅仅用于可以安全地重复执行多次的操作上. 如果一个元 ...

  2. PHP rewinddir() 函数

    打开一个目录,列出其中的文件,充值目录句柄,重新列出其中的文件,然后关闭: <?php$dir = "/images/"; // Open a directory, and ...

  3. Python每日一题 006

    题目 你有一个目录,装了很多照片,把它们的尺寸变成都不大于 iPhone5 分辨率的大小. 如果只是单纯的通过将图片缩放到iPhone5分辨率大小,显然最后呈现出来的效果会很糟糕.所以等比例缩放到长( ...

  4. 微信小程序学习笔记(二)--框架-全局及页面配置

    描述和功能 框架提供了自己的视图层描述语言 WXML 和 WXSS,以及基于 JavaScript 的逻辑层框架,并在视图层与逻辑层间提供了数据传输和事件系统,让开发者能够专注于数据与逻辑. 响应的数 ...

  5. Tomcat负载均衡、调优核心应用进阶学习笔记(一):tomcat文件目录、页面、架构组件详解、tomcat运行方式、组件介绍、tomcat管理

    文章目录 tomcat文件目录 bin conf lib logs temp webapps work 页面 架构组件详解 tomcat运行方式 组件介绍 tomcat管理 tomcat文件目录 ➜ ...

  6. html5中的拖拽功能

    拖拽元素支持的事件 ondrag 应用于拖拽元素,整个拖拽过程都会调用 ondragstart 应用于拖拽元素,当拖拽开始时调用 ondragleave 应用于拖拽元素,当鼠标离开拖拽元素是调用 on ...

  7. leetcode python丑数

    # Leetcode 263 丑数### 题目描述 编写一个程序判断给定的数是否为丑数. 丑数就是只包含质因数 `2, 3, 5` 的**正整数**. **示例1:** 输入: 6 输出: true ...

  8. 使用element-ui 组件动态合并table的行/列(第二次修改)

    这是第二次修改,在通过调用后台接口返回来的时候,发现了代码中的问题:现在将博客中错误的地方改过来,添加备注 文章需求:动态实现table表格中行/列的自动合并 使用框架及UI类库:Vue+Elemen ...

  9. 洛谷 P2024 [NOI2001]食物链——带权值的并查集维护

    先上一波题目 https://www.luogu.org/problem/P2024 通过这道题复习了一波并查集,学习了一波带权值操作 首先我们观察到 所有的环都是以A->B->C-> ...

  10. 33-python基础-python3-列表插入元素-insert()方法-append()方法-extend()方法

    1-insert()方法 insert()方法可以在列表任意下标处插入一个值. insert()方法的第一个参数是新值的下标,第二个参数是要插入的新值. 2-append()方法 调用 append( ...