Spring Security + JWT学习
开胃: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见
不好理解的地方做了特别详细的说明,大家学习可自行下载即可:
项目说明望周知
自测结果先说明一下:
注册用户
用户登录:
用户带着token去访问服务
然后就是项目源码说明:TODO 观看大体上的说明即可,比较难理解的我都是一行一行给了备注的
.
Spring Security + JWT学习的更多相关文章
- Spring Security + JWT实现前后端分离权限认证
现在国内前后端很多公司都在使用前后端分离的开发方式,虽然也有很多人并不赞同前后端分离,比如以下这篇博客就很有意思: https://www.aliyun.com/jiaocheng/650661.ht ...
- Spring Boot整合实战Spring Security JWT权限鉴权系统
目前流行的前后端分离让Java程序员可以更加专注的做好后台业务逻辑的功能实现,提供如返回Json格式的数据接口就可以.像以前做项目的安全认证基于 session 的登录拦截,属于后端全栈式的开发的模式 ...
- 基于Spring Boot+Spring Security+JWT+Vue前后端分离的开源项目
一.前言 最近整合Spring Boot+Spring Security+JWT+Vue 完成了一套前后端分离的基础项目,这里把它开源出来分享给有需要的小伙伴们 功能很简单,单点登录,前后端动态权限配 ...
- Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二)
Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(二) 摘要 上一篇https://javaymw.com/post/59我们已经实现了基本的登录和t ...
- Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一)
标题 Spring Boot+Spring Security+JWT 实现 RESTful Api 认证(一) 技术 Spring Boot 2.Spring Security 5.JWT 运行环境 ...
- 4-12 Spring Security + JWT
Spring Security + JWT 此前,在处理登录的业务中,当视为登录成功时,返回的字符串并不是JWT数据,则应该将此数据改为必要的JWT数据. @Service public class ...
- springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期
写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...
- 【项目实践】一文带你搞定Spring Security + JWT
以项目驱动学习,以实践检验真知 前言 关于认证和授权,R之前已经写了两篇文章: [项目实践]在用安全框架前,我想先让你手撸一个登陆认证 [项目实践]一文带你搞定页面权限.按钮权限以及数据权限 在这两篇 ...
- Spring Security Jwt Token 自动刷新
token的自动刷新 一.功能需求 二.功能分析 1.token 的生成 2.token 的自动延长 3.系统资源的保护 4.用户如何传递 token 三.实现思路 1.生成 token 和 refr ...
随机推荐
- 【leetcode】421. Maximum XOR of Two Numbers in an Array
题目如下: 解题思路:本题的难点在于O(n)的复杂度.为了减少比较的次数,我们可以采用字典树保存输入数组中所有元素的二进制的字符串.接下来就是找出每个元素的异或的最大值,把需要找最大值的元素转成二进制 ...
- 【JS】js引擎执行过程
概述 js引擎执行过程主要分为三个阶段,分别是语法分析,预编译和执行阶段,上篇文章我们介绍了语法分析和预编译阶段,那么我们先做个简单概括,如下: 语法分析: 分别对加载完成的代码块进行语法检验,语法正 ...
- VIM的一些使用积累
替换: :s/cst/dst/gc 黏贴后格式不对齐: gg=G 全选并黏贴 gg :"+yG
- 【LeetCode 33】搜索旋转排序数组
题目链接 [题解] 会发现旋转之后,假设旋转点是i 则0..i-1是递增有序的.然后i..len-1也是递增有序的. 且nums[i..len-1]<nums[0]. 而nums[1..i-1] ...
- windows下Mysql5.7表名不区分大小写问题
前言 Windwos文件系统本身是不区分大小写的,但是Linux文件系统是支持大小写的.于是安装在Linux下的Mysql导出到windows下可能因为大小写问题导致错误,因此要开启window下My ...
- new运算符工作原理(new运算符的伪码实现)
// 只要函数创建,就有一个prototype属性// 构造函数和普通函数的区别就是调用的时候又没有用 new function Fn() { // this 就是实例化后的对象 三段式 var th ...
- js预编译的四部曲
众所周知javascript是解释性语言,主要特点为解释一行执行一行. 而在js运行时会进行三件事:1语法分析 2.预编译 3.解释执行 语法分析会在代码执行前对代码进行通篇检查,以排除一些低级错 ...
- AVL树,C语言实现,完整代码,先贴上,讲解稍后
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #de ...
- 【webpack】webpack之postcss-loader的基本使用---【巷子】
一.postcss-loader简介 postcss-loader 用来对.css 文件进行处理,并添加在 style-loader 和 css-loader 之后.通过一个额外的 postcss 方 ...
- nginx-413
修改nginx配置文件:client_max_body_size 300M 修改php.ini upload_max_filesize | post_max_size








