Java系列文章目录
补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史
文章目录
- Java系列文章目录
- 一、前言
- 二、学习内容:
- 三、问题描述
- 四、解决方案:
- 4.1 认识依赖
- 4.2 使用JWT
- 4.3 登入实现
- 4.4 配置拦截器
- 4.5 获取数据
- 五、总结:
一、前言
- 学习如何在登入过程保证传输信息安全
- 流程图原作者 流程图来源 JWT的讲解也有可看这篇文章
- 本文以实操为主
- 本文自定义工具类仅仅是示例
二、学习内容:
- Token+Redis 方法
一种结合JWT与Redis的解决方案
- 服务器生成令牌并将器存储在Redis中,同时前端只持有此令牌本身
三、问题描述
- 保证传输的安全性
- 想了解JWT可看这篇文章 流程图来源
实操如下流程:
四、解决方案:
4.1 认识依赖
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.2</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.2</version>
<scope>runtime</scope>
</dependency>
- 使用JWT需要的依赖
4.2 使用JWT
JwtConfig
通过properties
文件配置JWT
- JWT的工具类
这个只是示例使用安全性可能没那么高可以用专门的封装库
@Component
public class JwtUtil {
@Autowired
private JwtConfig jwtConfig;
private final Key key ;
public JwtUtil(JwtConfig jwtConfig){
this.jwtConfig=jwtConfig;
key = Keys.hmacShaKeyFor(jwtConfig.getKey().getBytes());
}
//创建
public String createJwt(String id) {
Claims claims = Jwts.claims();
claims.put("id",id);
return Jwts.builder()
.setClaims(claims)
//.setExpiration(new Date(System.currentTimeMillis() + jwtConfig.getTtl()))
.signWith(key)
.compact();
}
//解密
public Claims parseJwt(String token) {
return Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token)
.getBody();
}
public boolean validateToken(String token) {
try {
Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
}
4.3 登入实现
密码比较不可以用equals,明码比较的话安全性低
- 前端输入账号密码
- 根据账号获得数据库加密的密码
- 前端密码加密后跟数据库密码比较
- 比对成功后签Token返回
🌟 前端要获取Token
🌟 JWT不是很安全,用户的密码一定不能保存到JWT中
登入逻辑如下:
后端控制层与逻辑层:
- 测试登入
ApiPost模拟前端
登入后返回前端的数据
- 后台显示结果
4.4 配置拦截器
- 拦截器排除登入以外的路径
拦截器拦截判断请求头与Token
🌟 前端已经收到Token了接下来交互验证都通过这个Token
🌟 拦截后验证Token是否过期
拦截器逻辑如下:
拦截器代码如下:
4.5 获取数据
- 主要判断头部以及Token是否过期并顺便进行延期
登入后访问其他页面不需要再重新登入,因为已经持有Token且没有过期
🌟 通过拦截器后执行业务逻辑
获取数据逻辑:
获取数据代码:
- 如果Token存储时间不够会进行延期处理
如果长时间没使用就退出
- 经过审核后返回数据
ApiPost模拟前端
五、总结:
JWT(JSON Web Token)是一种用于身份验证和授权的开放标准。它是一个轻量级的跨平台解决方案,可以在不同的系统之间安全地传输和验证信息。
JWT由三部分组成:头部(Header)、负载(Payload)和签名(Signature)。
- 头部包含了加密算法、令牌类型等信息,一般使用Base64编码进行编码。
- 负载是JWT的主要部分,包含了一些声明(claims),例如用户ID、角色等信息。负载也可以包含自定义的声明。负载也使用Base64编码进行编码。
- 签名用于保证令牌的完整性和真实性。签名由头部、负载、预先定义的密钥和指定的加密算法组成。一般使用HMAC(Hash-based
Message Authentication Code)或RSA(Rivest-Shamir-Adleman)算法进行签名。
使用JWT进行身份验证和授权的流程如下:
用户登录,服务器验证用户信息。
服务器生成JWT,将用户信息和其他必要的信息编码到负载中。
服务器使用密钥对JWT进行签名,生成签名。
服务器将JWT和签名返回给客户端。
客户端在后续请求中将JWT放入请求头、Cookie或其他合适的位置进行传输。
服务器验证JWT的签名,并根据负载中的信息进行权限控制和身份验证。
JWT的优点是简单、轻量级、跨平台、可扩展性强,并且不需要在服务器端保存用户的登录状态。缺点是一旦签发的JWT被盗用,无法立即使其失效,除非附加一些额外的逻辑来实现JWT的撤销。
在使用JWT时需要注意以下几点:
JWT中不应包含敏感信息,因为负载是经过Base64编码的,可能会被解码。
密钥的安全非常重要,因为密钥用于生成和验证签名。应该使用强密码来保护密钥,并定期更换密钥。
JWT的过期时间应该适当设置,以免被盗用后长时间有效。
如果需要撤销JWT,可以使用黑名单或者额外的逻辑来实现。
(后续有遇到问题再添加)
声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。