SpringBoot使用JWT进行身份验证

这篇具有很好参考价值的文章主要介绍了SpringBoot使用JWT进行身份验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

JWT身份验证的流程

  1. 用户登录: 用户向服务器提供他们的用户名和密码。

  2. 服务器验证:服务器接收到请求,验证用户名和密码。

  3. 生成JWT:如果用户名和密码验证通过,服务器将创建一个 JWT。 JWT 包含了一些数据(称为声明),例如用户 ID、用户名、令牌过期时间等。然后,服务器将对 JWT 进行签名,并将其发送回用户。

  4. 用户存储JWT:用户接收到 JWT,并将其存储在某个位置,例如Web浏览器的localStorage中。

  5. 发送带有JWT的请求:之后,每当用户向服务器发送请求(例如获取数据)时,他们都将在请求头的 Authorization 字段中包含 JWT。

  6. 服务器验证JWT:服务器接收到用户的请求,并从 Authorization 头中提取 JWT。然后,服务器验证该 JWT:它会检查 JWT 是否已经过期,验证签名是否有效,还可能验证一些其他的声明。如果 JWT 有效,服务器就知道这个请求是合法的,并继续处理请求。

  7. 返回响应:一旦服务器处理完用户的请求,它就会将响应发送回用户。

  8. 刷新JWT:如果 JWT 过期了,服务器可能会返回一个新的 JWT 给用户,或者让用户重新登陆,以便他们可以继续发送合法的请求。

JWT的安全性

如果你改变了 JWT 中的任何部分(包括头部、负载或签名),然后尝试验证它,你可能会遇到几个问题:

  1. 签名错误:JWT 的签名是根据头部和负载计算得出的。如果你修改了头部或负载的任何部分,那么签名就不再有效,JWT 的验证将会失败。这是因为签名是为了确保 JWT 的头部和负载没有被篡改。

  2. 格式错误:如果你修改了 JWT 的格式(例如,删除了某个部分,或者改变了部分之间的点号分隔符),那么 JWT 可能无法被正确解析,这将导致错误。

  3. 负载数据错误:如果你修改了负载中的数据(这是 JWT 中包含的实际信息,如用户 ID、过期时间等),那么这些数据可能无法被正确解析,或者可能导致验证错误(例如,如果你把过期时间改为了过去的时间,那么 JWT 将被视为已经过期)。

SpringBoot使用JWT进行身份验证,javaWeb,python,开发语言

SpringBoot中使用JWT

 添加maven依赖

<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>
package xin.students.springbootpro;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.UUID;

@SpringBootTest
class SpringBootProApplicationTests {

    // 设置 token 过期时间为24小时
    private long time = 1000 * 60 * 60 * 24;

    // 使用 HS256 算法生成一个安全的密钥
    private SecretKey signature = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    @Test
    public void createToken() {
        // 构建一个 JWT Builder
        JwtBuilder jwtBuilder = Jwts.builder();

        // 生成 JWT Token
        String jwtToken = jwtBuilder
                .setHeaderParam("typ", "JWT") // 设置 JWT 类型
                .setHeaderParam("alg", "HS256") // 设置签名算法
                .claim("username", "tom") // 添加 username 到载荷中(自定义的key:value)
                .claim("role", "admin") // 添加 role 到载荷中(自定义的key:value)
                .setSubject("admin-test") // 设置主题
                .setExpiration(new Date(System.currentTimeMillis() + time)) // 设置过期时间
                .setId(UUID.randomUUID().toString()) // 设置 JWT ID,通常是随机生成的
                .signWith(signature) // 签名 JWT,用以验证其完整性
                .compact(); // 压缩 JWT 到一个 compact, URL-safe string
        System.out.println(jwtToken);

        System.out.println("下面是解密后的原文------------------------------------");

        // 解析生成的 token
        parseToken(jwtToken);
    }

    public void parseToken(String token) {
        // 创建一个 JWT 解析器
        JwtParser jwtParser = Jwts.parserBuilder()
                .setSigningKey(signature)
                .build();
        // 解析 token
        Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);
        // 获取载荷
        Claims claims = claimsJws.getBody();
        // 打印载荷中的各种信息
        System.out.println(claims.get("username")); // 打印 username对应的值
        System.out.println(claims.get("role")); // 打印 role对应的值
        System.out.println(claims.getId()); // 打印 JWT ID
        System.out.println(claims.getSubject()); // 打印主题
        System.out.println(claims.getExpiration()); // 打印过期时间
    }
}

SpringBoot使用JWT进行身份验证,javaWeb,python,开发语言文章来源地址https://www.toymoban.com/news/detail-569276.html

Controller示例

package xin.students.springbootpro.util;

import io.jsonwebtoken.*;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.UUID;

public class JwtUtil {

    // 有效时间为5秒
    private static long time = 1000 * 5;

    private static SecretKey signature = Keys.secretKeyFor(SignatureAlgorithm.HS256);

    public static String createToken() {
        JwtBuilder jwtBuilder = Jwts.builder();

        // 生成 JWT Token
        String jwtToken = jwtBuilder
                .setHeaderParam("typ", "JWT") // 设置 JWT 类型
                .setHeaderParam("alg", "HS256") // 设置签名算法
                .claim("username", "admin") // 添加 username 到载荷中(自定义的key:value)
                .claim("password", "123") // 添加 username 到载荷中(自定义的key:value)
                .claim("role", "admin") // 添加 role 到载荷中(自定义的key:value)
                .setSubject("admin-test") // 设置主题
                .setExpiration(new Date(System.currentTimeMillis() + time)) // 设置过期时间
                .setId(UUID.randomUUID().toString()) // 设置 JWT ID,通常是随机生成的
                .signWith(signature) // 签名 JWT,用以验证其完整性
                .compact(); // 压缩 JWT 到一个 compact, URL-safe string
        System.out.println(signature);
        return jwtToken;
    }

    public static Boolean checkToken(String token) {
        // 判断 token 是否为空
        if (token == null) {
            return false;
        }
        try {
            // 解析并验证 token
            Jws<Claims> jws = Jwts.parserBuilder()
                    .setSigningKey(signature)  // 使用之前的签名秘钥验证 token
                    .build()
                    .parseClaimsJws(token);

            // 从 jws 中获取到 token 的载荷
            Claims claims = jws.getBody();
            String username = claims.get("username", String.class);
            String password = claims.get("password", String.class);
            String role = claims.get("role", String.class);
            System.out.println("username  " + username);
            System.out.println("password  " + password);
            return username.equals("admin") && password.equals("123");
        } catch (Exception e) {
            return false;
        }
    }
}

Vue登录示例

const fun = () => {
  axios.get("http://localhost:81/login", {params: ruleForm}).then(res => {
    if (res.data === null || res.data === '')
      console.log("密码不匹配")
    else {
      console.log(res.data)
      localStorage.setItem("access-admin", JSON.stringify(res.data));
      router.push("/");
    }

  }).catch(error => {
    console.log(error);
  })
}

Vue路由守卫校验是否登录示例

import {createRouter, createWebHistory, createWebHashHistory} from 'vue-router'
import axios from "axios";

const routes = [
    {
        path: '/',
        name: 'home',
        component: () => import('@/components/Home.vue')
    },
    {
        path: '/about',
        name: 'about',
        component: () => import(/* webpackChunkName: "about" */ '@/components/About.vue')
    },
    {
        path: '/login',
        name: 'login',
        component: () => import(/* webpackChunkName: "about" */ '@/components/Login.vue')
    },
    {
        path: '/error',
        name: 'error',
        component: () => import(/* webpackChunkName: "about" */ '@/components/Error.vue')
    }
]

const router = createRouter({
    history: createWebHistory(),
    routes
})

router.beforeEach((to, from, next) => {
    if (to.path.startsWith("/login")|| to.path.startsWith("/error")) {
        window.localStorage.removeItem("access-admin");
        next();
    } else {
        let admin = JSON.parse(window.localStorage.getItem("access-admin"));
        if (!admin) {
            next({path: "/login"})
        } else {
            axios({
                url: "http://localhost:81/checkToken",
                method: "get",
                headers: {
                    token: admin.token
                }
            }).then((res) => {
                console.log(res.data);
                console.log(typeof res.data);
                if (res.data === false) {
                    console.log("校验失败!");
                    next({path: "/error"});
                }else{
                    next();
                }
            }).catch((err) => {
                console.error(err);
                next({path: "/error"});
            })
        }
    }
})

export default router

到了这里,关于SpringBoot使用JWT进行身份验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GOLANG进阶:govalidator过滤器,MD5,JWT身份验证,redis

    引入资源包(两种方式): go get github.com/asaskevich/govalidator go get gopkg.in/asaskevich/govalidator.v10 代码( 可以写在结构体中,也可以单独使用 ): type User struct {     gorm.Model     USERNAME string `json:\\\"name\\\" validate :\\\"min=0,max=35\\\"`     PASSWOR string `validate:\\\"required\\\"`     SEX int8  ` validate :

    2024年02月16日
    浏览(42)
  • SpringBoot项目使用JWT令牌进行权限校验

    要在Spring Boot中进行JWT校验,你需要遵循以下步骤: 在你的pom.xml文件中添加以下依赖: 创建一个名为JwtUtil的工具类,用于生成和解析JWT令牌。 在你的Controller中,使用JwtUtil工具类来验证请求头中的JWT令牌。 现在,当用户访问/secure端点时,系统会检查请求头中的JWT令牌是否

    2024年01月23日
    浏览(57)
  • Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践(解决升级问题)

    在Streamlit官方文档中,没有提供提供安全身份验证组件。目前,第三方streamlit-authenticator提供此功能,详见引用我原来的博文,在《Streamlit应用程序使用Streamlit-Authenticator进行用户的安全身份验证实践》文中,原使用的代码报错: 报错原因是Streamlit-Authenticator包升级了,原代码

    2024年02月06日
    浏览(55)
  • Jwt(Json web token)——使用token的权限验证方法 & 用户+角色+权限表设计 & SpringBoot项目应用

    1.认证鉴权服务,注册中心,认证中心,鉴权中心; 2.用户,角色,权限表设计,数据库视图的使用; 3.项目中的应用,使用自定义注解+拦截器; 4.枚举类型的json化, @JsonFormat(shape = JsonFormat.Shape.OBJECT) @Getter https://gitee.com/pet365/springboot-privs-token 用户和权限之间关系(多对多

    2024年02月14日
    浏览(75)
  • Springboot整合JWT完成验证登录

    这个Java类是一个工具类,用于生成和验证JSON Web Tokens(JWT)。JWT是一种开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。这个信息可以被验证和信任,因为它是数字签名的。在这个例子中,使用了Java的jsonwebtoken库。 下面

    2024年02月09日
    浏览(47)
  • 如何进行安全可靠的API身份验证?

    前言: 在开发安全的 REST API 时,身份验证是必不可少的。你可以将你的应用程序想象成一个聚会,那么身份验证就像一扇门,决定哪些客人可以进入——或者更准确地说,哪些请求可以进出。 接下来我将介绍四种常用的身份验证方法,包括 API密钥、OAuth 2.0、HTTP身份验证方

    2024年02月08日
    浏览(35)
  • 【SpringBoot】1、SpringBoot整合JWT实现Token验证

    单点登录(Single Sign On), 简称为 SSO , 是目前比较流行的企业业务整合的解决方案之一. SSO的定义:在多个应用系统中, 用户只需要登录一次就可以访问所有相互信任的应用系统, 企业间需要相互授信 众所皆知, HTTP是 无状态的协议 , 这意味着 服务器无法确认用户的信息。 于是乎,

    2024年02月03日
    浏览(74)
  • 3-2. SpringBoot项目集成【用户身份认证】实战 【实战核心篇】基于JWT生成和校验Token

    书接上文 技术选型篇,我们做了【用户身份认证】的技术选型说明,对基于 Session、Token、JWT 的方案进行了详细的对比分析,详细说明了它们都是什么和各自的优缺点!这些是实战的基础,还没看过的同学,建议先看上文。最终采用的是目前流行的 基于JWT的Token用户身份认证

    2023年04月08日
    浏览(51)
  • SpringBoot集成JWT token实现权限验证

    先在pom中引入 JWT依赖 然后引入一个生成的 token 的工具类         然后具体实现上有两种方式,一个是使用自定义注解配合拦截器,另外一个是使用拦截器。 方法一:         先自定义个注解,然后再定义一个自定义拦截器 JwtInterceptor 类,同时让 JwtInterceptor 类继承

    2024年02月10日
    浏览(58)
  • 使用 SpringBoot 进行优雅的数据验证

    在程序进行数据处理之前,对数据进行准确性校验是我们必须要考虑的事情。尽早发现数据错误,不仅可以防止错误向核心业务逻辑蔓延,而且这种错误非常明显,容易发现解决。 JSR303 规范(Bean Validation 规范)为 JavaBean 验证定义了相应的元数据模型和 API。在应用程序中,

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包