SpringBoot 通过jjwt快速实现token授权
1.首先理解jwt是什么
jwt:全称(JSON Web Token),是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为JSON对象在各方之间安全地传输信息。是目前最流行的跨域身份验证解决方案。
2.jwt的结构是什么样的
jwt由三部分组成,它们之间用圆点(.)连接。这三部分分别是
1. Header
2. Payload
3. Signature例如:aaa.bbb.zzz
具体说明如下:Header:由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。
例如:{“alg”:”HS256”,“typ”:“JWT”
}然后,用Base64对这个JSON编码就得到JWT的第一部分Payload :是JWT的第二部分,是关于实体(通常是用户)和其他数据的声明例如:{“name”:“username”,“age”:18
}
对payload进行Base64编码就得到JWT的第二部分
注意:不要在JWT的payload或header中放置敏感信息,除非它们是加密的。
Signature:签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可,
例如:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
说明:Signature用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。
3. JWT与Session的差异
相同点:都是存储用户信息;然而,Session是在服务器端的,而JWT是在客户端的。不同点:Session方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力
4.Token授权是如何工作的
流程:1.用于通过用户名和密码登陆2.服务器校验用户名和密码3.服务器端提供一个token给客户端4.客户端存储token,并在之后的请求中通过header部分携带传入服务器端5.服务器端校验客户端传入的token是否有效6.校验通过访问相应的资源
注意:如果是应用请求来自不同的域,当前应用请设置允许跨域。
JJWT(Java JWT):适用于 Java 和 Android 的 JSON Web Token(JWT)库
1.在Springboot项目中引入相关依赖如下:
<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>
2.相关类和接口
public class CommonConstants {public static final String JWT_KEY_USER_ID = "userId";public static final String JWT_KEY_NAME = "name";
}public class StringHelper {public static String getObjectValue(Object obj){return obj==null?"":obj.toString();}
}public interface IJWTInfo {/*** 获取用户名* @return*/String getUniqueName();/*** 获取用户ID* @return*/String getId();/*** 获取名称* @return*/String getName();
}
3.JWT具体操作类
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.joda.time.DateTime;public class JWTHelper {private static RsaKeyHelper rsaKeyHelper = new RsaKeyHelper();/*** 密钥加密token** @param jwtInfo* @param priKeyPath* @param expire* @return* @throws Exception*/public static String generateToken(IJWTInfo jwtInfo, String priKeyPath, int expire) throws Exception {String compactJws = Jwts.builder().setSubject(jwtInfo.getUniqueName()).claim(CommonConstants.JWT_KEY_USER_ID, jwtInfo.getId()).claim(CommonConstants.JWT_KEY_NAME, jwtInfo.getName()).setExpiration(DateTime.now().plusSeconds(expire).toDate()).signWith(SignatureAlgorithm.RS256, rsaKeyHelper.getPrivateKey(priKeyPath)).compact();return compactJws;}/*** 密钥加密token** @param jwtInfo* @param priKey* @param expire* @return* @throws Exception*/public static String generateToken(IJWTInfo jwtInfo, byte priKey[], int expire) throws Exception {String compactJws = Jwts.builder().setSubject(jwtInfo.getUniqueName()).claim(CommonConstants.JWT_KEY_USER_ID, jwtInfo.getId()).claim(CommonConstants.JWT_KEY_NAME, jwtInfo.getName()).setExpiration(DateTime.now().plusSeconds(expire).toDate()).signWith(SignatureAlgorithm.RS256, rsaKeyHelper.getPrivateKey(priKey)).compact();return compactJws;}/*** 公钥解析token** @param token* @return* @throws Exception*/public static Jws<Claims> parserToken(String token, String pubKeyPath) throws Exception {Jws<Claims> claimsJws = Jwts.parser().setSigningKey(rsaKeyHelper.getPublicKey(pubKeyPath)).parseClaimsJws(token);return claimsJws;}/*** 公钥解析token** @param token* @return* @throws Exception*/public static Jws<Claims> parserToken(String token, byte[] pubKey) throws Exception {Jws<Claims> claimsJws = Jwts.parser().setSigningKey(rsaKeyHelper.getPublicKey(pubKey)).parseClaimsJws(token);return claimsJws;}/*** 获取token中的用户信息** @param token* @param pubKeyPath* @return* @throws Exception*/public static IJWTInfo getUserInfoFromToken(String token, String pubKeyPath) throws Exception {Jws<Claims> claimsJws = parserToken(token, pubKeyPath);Claims body = claimsJws.getBody();return new JWTInfo(body.getSubject(), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_USER_ID)), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_NAME)));}/*** 获取token中的用户信息** @param token* @param pubKey* @return* @throws Exception*/public static IJWTInfo getUserInfoFromToken(String token, byte[] pubKey) throws Exception {Jws<Claims> claimsJws = parserToken(token, pubKey);Claims body = claimsJws.getBody();return new JWTInfo(body.getSubject(), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_USER_ID)), StringHelper.getObjectValue(body.get(CommonConstants.JWT_KEY_NAME)));}
}
SpringBoot 通过jjwt快速实现token授权相关推荐
- SpringBoot快速实现微信授权登录
文章目录 1.引入weixin-java-mp 2.配置文件配置公众号信息 3.加载配置信息 3.1加载配置属性 3.2初始化配置 3.3Controller实现 4.设置微信公众平台 5.前台请求及 ...
- 【spring authorization server系列教程】(一)入门系列,spring authorization server简介。快速构建一个授权服务器(基于最新版本0.3.0)
系列文章目录 [spring authorization server系列教程](一)入门系列,快速构建一个授权服务器 文章目录 系列文章目录 前言 一.目前已实现的功能 二.入门,一步一步快速开始构 ...
- springboot中JJWT的简单使用
springboot中JJWT的简单使用 一 什么是JWT jwt全称json web token,是基于json协议的用于结局认证授权的方法.token就是令牌,其主要作用是用来进行授权(Autho ...
- SpringBoot系列: RestTemplate 快速入门
==================================== 相关的文章 ==================================== SpringBoot系列: 与Sprin ...
- JeecgBoot 2.1 Online表单版本发布,基于SpringBoot+AntDesign的快速开发平台
项目介绍 Jeecg-Boot 是一款基于SpringBoot+代码生成器的快速开发平台!采用前后端分离架构:SpringBoot,Ant-Design-Vue,Mybatis,Shiro,JWT.强 ...
- 《SpringBoot揭秘:快速构建微服务体系》—第2章2.4节本章小结*
本节书摘来自华章出版社<SpringBoot揭秘:快速构建微服务体系>一书中的第2章,第2.4节本章小结*,作者王福强,更多章节内容可以访问云栖社区"华章计算机"公众号 ...
- 《SpringBoot揭秘:快速构建微服务体系》—第3章3.5节本章小结
本节书摘来自华章出版社<SpringBoot揭秘:快速构建微服务体系>一书中的第3章,第3.5节本章小结,作者王福强,更多章节内容可以访问云栖社区"华章计算机"公众号查 ...
- bootstrap table 分页_Java入门007~springboot+freemarker+bootstrap快速实现分页功能
本节是建立在上节的基础上,上一节给大家讲了管理后台表格如何展示数据,但是当我们的数据比较多的时候我们就需要做分页处理了.这一节给大家讲解如何实现表格数据的分页显示. 准备工作 1,项目要引入freem ...
- idea新建springboot后端到前端_基于SpringBoot+AntDesign的快速开发平台
项目介绍 Jeecg-Boot是一款基于SpringBoot+代码生成器的快速开发平台!前后端分离架构.技术采用SpringBoot.AntDesignVue.Mybatis.Shiro.JWT.强大 ...
最新文章
- 不要一辈子靠技术生存
- php接口数据安全解决方案(一)
- dwz ajax session超时跳转登录页(struts2自定义拦截器)
- 第13天学习Java的笔记(类定义)
- linux 查询替换文件内容吗,Linux 下查询文件的方法 替换文件内容
- Lowest Common Multiple Plus ——ACM
- C语言 指针声明和定义 - C语言零基础入门教程
- Tomcat log文件
- 【python基础知识】调用C++接口(setup.py运行)出现的各种问题
- ANSI C:+++
- Maven学习总结(21)——Maven常用的几个核心概念
- 需要显卡还是cpu_装机应该在哪个硬件上省钱, CPU还是显卡, 看完本文就知道了...
- string类有可以调换方向的函数吗_关于String类的split()方法
- php安全拦截,php类中的各种拦截器用法分析
- 深入浅出 — 数据分析
- QWidget_层级关系
- WordPress企业主题:企业一号
- Mac 安装 Icarus-Verilog 报错解决方案参考
- 图文详解双向链表原理
- iOS 15 导航栏(Navigation)变白(导航栏不见)