IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SpringBoot中使用 JWT + 拦截器实现登录验证 -> 正文阅读

[大数据]SpringBoot中使用 JWT + 拦截器实现登录验证

旧的方法存在缺点

之前的策略是,UUID + redis + 拦截器的思路。

服务器端在验证 roomid 和 password相匹配之后,使用 UUID 生成一个字符串作为 token ,接着往 Redis 服务中写入一个映射(token, roomid), 设置过期时间为20分钟, 并且把token 通过响应返回给客户端。因此,客户端便可以使用这个 UUID 产生的 token 来访问。

对于需要携带 token 的请求,安排了一个拦截器来检查这些请求,检验请求所携带的 token 与 roomid 是否与 Redis 中已有的映射相匹配,若匹配,说明已经授权可以可以放行,若不匹配,则拒绝请求。

缺点在于:

  • 服务器端需要使用 Redis 保存许多键值对,占用一定的内存空间。
  • 客户端获取的值是单纯的值,当用户太多时,UUID 的数目变得过多会加大被猜中的概率。

JWT

token 的三部分中,第一部分是头,第二部分是负载,第三部分是签名,一二部分都是base64加密,不能存放敏感信息。
如果客户端私自修改过期时间,token 的验证环节可以检测出来。(有使用密钥对过期时间进行加密)
如果修改客户端 roomid,是否意味着可以冒用他人的 token?token 生成过程有把负载部分考虑在内,验证的时候可以察觉到负载被修改。
使用 JWT 是用时间换空间,节省了服务器端的空间。

使用 JWT(JSON Web Token) 的方法

maven 中添加依赖,引入 Java-jwt 项目。

<dependency>
        <groupId>com.auth0</groupId>
        <artifactId>java-jwt</artifactId>
        <version>3.18.2</version>
</dependency>

服务器有一个不能公开的密钥。

服务器端在验证 roomid 和 password 之后,Token 签名算法使用密钥根据 payload 的内容生成签名,可以配置token 的过期时间(本项目配置的是 1 小时),token 的生成相当于服务器对验证通过者的授权,授权其可进行 1 小时的免密码畅行。最终得到一个 token 通过响应返回给客户端『generate 方法』。 客户端可以使用这个 token 进行请求。

对于需要携带 token 的请求,安排了一个拦截器进行检查,『validate 方法』使用 token 校验算法来检查请求所携带的 token的签名是否有效(过期或者 roomid 与签名内容不匹配都会被认为无效)。若 token 检验正确,则放行,若检验错误,则拒绝请求。

下方是 token 的生成与验证,其中 secret 是自己设定的密钥(是一个字符串,我的密钥可不能公开贴出来)。

token 生成过程:

 public static String generate(String roomid){
        String token = "";
        try{
            Algorithm algorithm = Algorithm.HMAC256(secret);
            Map<String,Object> map = new HashMap<>();
            map.put("roomid",roomid);
            token = JWT.create().withIssuer("auth0")
                    .withPayload(map)
                    .withExpiresAt(new Date(System.currentTimeMillis() + (long)3600*1000))
                    .sign(algorithm);
        }catch(JWTCreationException e){
            e.printStackTrace();
        }
        return token;
    }

token 的验证,验证通过则返回 roomid,验证不通过则返回 null。

public static String validate(String roomid, String token){
        DecodedJWT jwt = null;
        try{
            Algorithm algorithm = Algorithm.HMAC256(secret);
            JWTVerifier jwtVerifier = JWT.require(algorithm)
                    .withClaim("roomid",roomid)
                    .withIssuer("auth0").build();
            jwt = jwtVerifier.verify(token);
            if (jwt == null )return null;
            Claim claim = jwt.getClaim("roomid");
            if (claim == null )return null;
            return claim.asString();
        }catch (JWTVerificationException e){
            return null;
        }

    }

参考:https://github.com/auth0/java-jwt

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-10-04 12:55:11  更:2021-10-04 12:57:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 1:20:14-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码