Springboot整合JWT

简介: Springboot整合JWT

一 jwt

1.什么是jwt

官网介绍地址:https://jwt.io/introduction/

JWT简称Json Web Token,也就是通过JSON形式作为web应用中的令牌,用于在各方之间安全地将信息作为JSON对象传输。在数据传输过程中还可以完成数据加密、签名等相关处理。

2.JWT可以做什么

授权:用户登录后每个后续请求将包括jwt,从而允许用户访问该令牌允许的路由、服务和资源。许多的单点登录就是使用了jwt,开销小并且可以在不同域中使用

信息交换:因为jwt具有签名机制,在不同的系统之间进行数据交换或者请求相关接口,通过验签然后执行接口请求和传输数据

3.传统的基于session验证

验证方式

当用户第一次请求的时候,系统会创建一个专属此用户的session,后续来不同的用户,一次创建不同的session。当浏览器第一次访问系统的时候,系统会以cookie的方式为浏览器设置要给sessionId,每个用户对应一个sessionId。后续发起请求的时候,默认会携带这个sessionId进行认证

验证流程

问题

  • 每个用户都要经过系统认证,认证之后都要在服务端保存一个session ,随着用户的增加,服务端开销明显增大
  • 验证之后session保存在了当前登录的服务端,如果涉及到分布应用,限制了负载均衡的能力,极大增加了应用扩展力难度
  • 因为是基于cookie进行用户识别的,所以如果cookie被截获,用户很容易受到跨站请求伪造攻击

4.基于jwt的认证

系统通过前端传过来的用户名和密码进行验证,成功后将用户的id等其他信息放在jwt payload,将payload和header分别进行Base64编码拼接后签名;

形成一个jwt,是一个xxxxx.yyyyy.zzzzz字符串。后端将这个jwt放回给前端

前端可以将此jwt保存在localStorage或者sessionStorage上,退出登录时前端删除保存的jwt即可;

前端请求时候携带jwt,进行验证jwt的有效性,通过后返回相应结果。

5.jwt结构

jwt由Header、Payload、Signature三部分组成,中间用.分开,即xxxxx.yyyyy.zzzzz

heder

头部分由令牌类型(即JWT)和所使用的签名算法,例如HMAC,SHA256,RSA,通过BASE64编码将组成jwt结构的第一部分

{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

第二部分是有效负载声明,包含用户数据和其他相关的数据声明,同样会使用base64编码组成JWT结构的第二部分;因为base64编码后是可以解码的,所以在payload中不要存放用户密码

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

Signature

前面两部分是使用base64进行编码,即前端可以解开知道里面的信息,Signature需要使用编码后的heder和Payload以及我们提供一个密钥,然后使用header中指定的签名算法进行签名,签名保证jwt没有被篡改

6.使用jwt

6.1 引入依赖

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

6.2 生成token以及根据令牌和签名解析数据

public class JWTUtil {
 
    //密钥
    private static String KEY="12R48!UIE_E";
 
    /**
     * 生成token
     * @param map 传入payload
     * @return token
     */
    public static String getToken(Map<String,String> map){
        JWTCreator.Builder builder = JWT.create();
        map.forEach((k,v)->{
            builder.withClaim(k,v);
        });
        Calendar instance = Calendar.getInstance();
        instance.add(Calendar.DATE,7);
        builder.withExpiresAt(instance.getTime());
        return builder.sign(Algorithm.HMAC256(KEY));
    }
 
    /**
     * 根据令牌和签名解析数据,返回验签之后的结果 验签失败 抛出异常
     * 
     * SignatureVerificationException 签名不一致
     * TokenExpiredException 令牌过期
     * AlgorithmMismatchException 算法不匹配
     * InvalidClaimException 失败的payload异常
     * 
     * @param token 解码之后的token 包含可以使用的信息
     * @return
     */
    public static DecodedJWT verify(String token){
        return JWT.require(Algorithm.HMAC256(KEY)).build().verify(token);
    }
}

 

二 Springboot整合jwt

结合拦截器对每个接口验证

拦截器

配置

业务操作

@PutMapping
    public Map<String,Object> test(HttpServletRequest request){
        Map<String,Object> map= new HashMap<>();
        String token = request.getHeader("token");
        DecodedJWT verify = JwtUtil(token);
        System.out.println("用户id:"+verify.getClaim("id").asString());
        System.out.println("用户名:"+verify.getClaim("name").asString());
        //自己逻辑业务处理
        map.put("state",true);
        map.put("msg","请求成功");
        return map;
    }

注意:对于单体应用直接是使用拦截器即可,对于分布式引用在网关中解决


相关文章
|
11月前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
1927 5
|
10月前
|
XML JavaScript Java
SpringBoot集成Shiro权限+Jwt认证
本文主要描述如何快速基于SpringBoot 2.5.X版本集成Shiro+JWT框架,让大家快速实现无状态登陆和接口权限认证主体框架,具体业务细节未实现,大家按照实际项目补充。
666 11
|
12月前
|
JSON 安全 算法
Spring Boot 应用如何实现 JWT 认证?
Spring Boot 应用如何实现 JWT 认证?
775 8
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
126 2
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
367 0
|
JSON 算法 安全
SpringBoot从入门到精通(三十四)如何集成JWT实现Token验证
近年来,随着前后端分离、微服务等架构的兴起,传统的cookie+session身份验证模式已经逐渐被基于Token的身份验证模式取代。接下来介绍如何在Spring Boot项目中集成JWT实现Token验证。
SpringBoot从入门到精通(三十四)如何集成JWT实现Token验证
|
JSON 算法 Java
SpringBoot集成JWT实现token验证
JWT官网: https://jwt.io/JWT(Java版)的github地址:https://github.com/jwtk/jjwt 什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).定义了一种简洁的,自包含的方法用于通信双方之间以JSON对象的形式安全的传递信息。
4093 0
|
Java
Java:SpringBoot集成JWT实现token验证
Java:SpringBoot集成JWT实现token验证
279 0
Java:SpringBoot集成JWT实现token验证