
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 {@Autowiredprivate 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,可以使用黑名单或者额外的逻辑来实现。
(后续有遇到问题再添加)
声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。