溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Spring Boot中JWT令牌生成與驗(yàn)證

發(fā)布時(shí)間:2024-11-15 12:10:02 來源:億速云 閱讀:79 作者:小樊 欄目:編程語言

在Spring Boot中,我們可以使用Java JWT(JSON Web Token)庫來生成和驗(yàn)證JWT令牌。一個(gè)流行的庫是jjwt(Java JWT)。下面是如何在Spring Boot項(xiàng)目中使用jjwt庫生成和驗(yàn)證JWT令牌的步驟:

  1. 添加依賴

在你的pom.xml文件中添加jjwt庫的依賴:

<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>
  1. 生成JWT令牌

首先,我們需要?jiǎng)?chuàng)建一個(gè)Java類來表示JWT令牌的載荷(claims)。例如,我們可以創(chuàng)建一個(gè)User類:

public class User {
    private String username;
    private String role;

    // Getters and setters
}

接下來,我們可以創(chuàng)建一個(gè)JwtUtil類來生成JWT令牌:

import io.jsonwebtoken.*;
import java.util.Base64;
import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "yourSecretKey"; // 用于簽名和驗(yàn)證JWT令牌的密鑰
    private static final long EXPIRATION_TIME = 86400000; // JWT令牌的過期時(shí)間(毫秒)

    public static String generateToken(User user) {
        return Jwts.builder()
                .setSubject(user.getUsername()) // 將用戶名作為令牌的subject
                .claim("role", user.getRole()) // 將用戶角色作為額外的claims
                .setIssuedAt(new Date()) // 設(shè)置令牌的發(fā)行時(shí)間
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) // 設(shè)置令牌的過期時(shí)間
                .signWith(SignatureAlgorithm.HS512, SECRET_KEY) // 使用HS512算法和密鑰進(jìn)行簽名
                .compact();
    }
}
  1. 驗(yàn)證JWT令牌

要驗(yàn)證JWT令牌,我們需要?jiǎng)?chuàng)建一個(gè)JwtController類來處理登錄和驗(yàn)證令牌的請(qǐng)求:

import io.jsonwebtoken.*;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api")
public class JwtController {

    @PostMapping("/login")
    public String login(@RequestBody User user) {
        // 在這里,你可以根據(jù)需要驗(yàn)證用戶的憑據(jù)(例如,檢查用戶名和密碼)
        // 如果驗(yàn)證成功,使用JwtUtil生成JWT令牌并返回給客戶端
        return JwtUtil.generateToken(user);
    }

    @GetMapping("/validate")
    public String validateToken(@RequestHeader("Authorization") String token) {
        try {
            Jws<Claims> jws = Jwts.parser()
                    .setSigningKey(SECRET_KEY)
                    .parseClaimsJws(token);

            // 驗(yàn)證成功,返回用戶名
            return jws.getBody().getSubject();
        } catch (JwtException e) {
            // 驗(yàn)證失敗,拋出異?;蚍祷劐e(cuò)誤信息
            throw new RuntimeException("Invalid JWT token");
        }
    }
}

現(xiàn)在,當(dāng)用戶登錄時(shí),服務(wù)器將生成一個(gè)JWT令牌并返回給客戶端??蛻舳诵枰诤罄m(xù)請(qǐng)求的Authorization頭中包含此令牌。服務(wù)器將驗(yàn)證令牌并返回相應(yīng)的用戶信息。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI