没有合适的资源?快使用搜索试试~ 我知道了~
SpringSecurity整合JWT.docx
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 3 浏览量
2022-06-27
21:25:12
上传
评论
收藏 314KB DOCX 举报
温馨提示
试读
22页
有状态登录 我们知道在原始的项目中我们是通过session和cookie来实现用户的识别认证。但是这样做无疑会增加服务器的压力,服务的保存了大量的数据。如果业务需要扩展,搭建了集群的话,还需要将session共享。 无状态登录 而什么是无状态登录呢,简而言之,就是服务的不需要再保存任何的用户信息,而是用户自己携带者信息去访问服务端,服务端通过这些信息来识别客户端身份。这样一来,有状态登录的缺点都被解决了,但是这同样也会带来新问题。比如token信息无法在服务端注销,必须要等其自己过期,占用更多的空间(意味着需要更多带宽),修改密码后原本的token在没过期时仍然可用访问系统等。
资源推荐
资源详情
资源评论
SpringSecurity 整合 JWT
前言
最近是真的懒,感觉我每个月都有那么几天什么都不想干。。
画风一转,前几天的 lpl 忍界大战是真的精彩,虚假的电竞春晚:RNG vs IG 。
真正的电竞春晚 TES vs IG。TES 自从阿水和 kasra 加入之后,状态直接起飞,
在我看来 TES 将是 s10 夺冠热门之一。不过这一次木叶村战胜了晓组织。
本以为会打满三局,没想到 ig 直接 2:0 带走。rookie 线上压制了新皇 knight,
确实永远可以相信宋义进,或许是因为小钰采访吧。
这两把我最没想到的是 kasra 被宁王压着打,几乎没有节奏,宝蓝在哪都是阿
水的噩梦。这波啊,这波是盗版打赢了正版,puff 小小的证明了自己。
进入正题
一、无状态登录
有状态登录
我们知道在原始的项目中我们是通过 session 和 cookie 来实现用户的识别认证。
但是这样做无疑会增加服务器的压力,服务的保存了大量的数据。如果业务需
要扩展,搭建了集群的话,还需要将 session 共享。
无状态登录
而什么是无状态登录呢,简而言之,就是服务的不需要再保存任何的用户信息,
而是用户自己携带者信息去访问服务端,服务端通过这些信息来识别客户端身
份。这样一来,有状态登录的缺点都被解决了,但是这同样也会带来新问题。
比如 token 信息无法在服务端注销,必须要等其自己过期,占用更多的空间
(意味着需要更多带宽),修改密码后原本的 token 在没过期时仍然可用访问
系统等。
二、JWT 介绍
1、什么是 jwt
JWT 是 Json Web Token 的缩写。它是基于 RFC 7519 标准定义的一种可以安
全传输的 小巧 和 自包含 的 JSON 对象。由于数据是使用数字签名的,所以是
可信任的和安全的。JWT 可以使用 HMAC 算法对 secret 进行加密或者使用
RSA 的公钥私钥对来进行签名。
我们来看一下 jwt 长什么样
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjb2Rlcm15IiwiYXV0aG9yaXRpZXMiOiJhZG1pbiI
sImV4cCI6MTU5NjA4MDM5OX0.rfDtzMus50uAFnqMw1tm3c_ZYbmUNkIRqMkeJ0510PAH-
RCUWtZkfNPTDYAGVVfDU6jmdEkGyNYvGy3UrNq5pA
JSON Web 令牌以紧凑的形式由三个部分组成,由点分隔,它们包括:
头部
负载
签名
头部(Header)
jwt 的头部承载两部分信息:
声明类型,这里是 jwt
声明加密的算法 通常直接使用 HMAC SHA256
像这样
{
'typ': 'JWT',
'alg': 'HS256'
}
载荷(Payload)
这个部分用来承载要传递的数据,他的默认字段有
iss:发行人
exp:到期时间
sub:主题
aud:用户
nbf:在此之前不可用
iat:发布时间
jti:JWT ID 用于标识该 JWT
除以上默认字段外,我们还可以自定义私有字段,例如
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
签名(Signature)
Signature 部分是对前两部分的签名,防止数据篡改。
2、JWT 工作流程
用户发起登录请求
服务端验证身份,将用户信息,标识等信息打包成 jwt token 返回给客户端
用户拿到 token,携带 token 发送请求给服务端
服务的验证 token 是否可用,可用便根据其 y 业务逻辑返回相应结果。
3、简单实现
首先我们在 maven 中引入以下依赖
<!--jjwt-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
新建 JwtTest 来测试一下
/**
* @author codermy
* @createTime 2020/7/30
*/
public class JwtTest {
public static void main(String[] args) {
String token = Jwts.builder()
//用户名
.setSubject("codermy")
//自定义属性 放入用户拥有请求权限
.claim("authorities","admin")
// 设置失效时间为 1 分钟
.setExpiration(new Date(System.currentTimeMillis()
+1000*60))
// 签名算法和密钥
.signWith(SignatureAlgorithm.HS512, "java")
.compact();
System.out.println(token);
}
输出
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJjb2Rlcm15IiwiYXV0aG9yaXRpZXMiOiJhZG1pbiI
sImV4cCI6MTU5NjA4MDM5OX0.rfDtzMus50uAFnqMw1tm3c_ZYbmUNkIRqMkeJ0510PAH-
RCUWtZkfNPTDYAGVVfDU6jmdEkGyNYvGy3UrNq5pA
我们再来解析
//解析 token
Claims claims = Jwts.parser()
.setSigningKey("java")
.parseClaimsJws(token)
.getBody();
System.out.println(claims);
//获取用户名
String username = claims.getSubject();
System.out.println("username:"+username);
//获取权限
String authority = claims.get("authorities").toString();
System.out.println("权限:"+authority);
System.out.println("到期时间:" + claims.getExpiration());
输出
{sub=codermy, authorities=admin, exp=1596082316}
username:codermy
权限:admin
到期时间:Thu Jul 30 12:11:56 CST 2020
三、整合 JWT
后端实现
其实 jwt 本身很好理解,无非就就是一把钥匙,可用打开对应的锁,这不过这
把钥匙稍微特殊点,它还带了主人的一些信息。难理解的是要将它符合业务逻
辑的整合进框架中。我自己就被绕了好久才明白。
我这里写了一个 Jwt 的工具类,用于生成和解析 jwt
/**
* @author codermy
* @createTime 2020/7/23
剩余21页未读,继续阅读
资源评论
小兔子平安
- 粉丝: 209
- 资源: 1940
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- mybatis中的动态sql, 涉及 where trim set if foreach等
- 简单- 快递运输(Java & JS & Python & C).html
- mybatis框架 更改ems系统,使用动态sql等.zip
- 易语言工具条下拉菜单实现
- Mybatis动态SQL高级映射.zip
- 源码esp8266开发板机智云机智云智能灯
- Python实现多图像转换成连贯的PDF文件,支持所有图片格式,可预览、裁剪、自定义PDF布局、设置图像顺序、PDF质量选择等
- H5腾讯地图选择位置组件
- 基于UCC28019+LM5017电源板硬件(原理图+PCB)工程文件.zip
- 源码esp8266开发板机智云机智云空气净化器
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功