最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring Boot整合JWT實現(xiàn)認證與授權的項目實踐

 更新時間:2025年06月29日 11:36:00   作者:木子空間Pro  
JWT是開放標準,用于在Web應用中安全傳輸信息,常用于身份驗證和信息交換,本文主要介紹了SpringBoot整合JWT實現(xiàn)認證與授權,具有一定的參考價值,感興趣的可以了解一下

概述

JSON Web Token (JWT) 是一種開放標準 (RFC 7519),它定義了一種緊湊且自包含的方式,用于在各方之間安全地傳輸信息。在Web應用中,JWT常用于身份驗證和信息交換。

依賴配置

首先需要在項目中添加JWT依賴:

<!-- JWT依賴 -->
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

JWT工具類封裝

我們創(chuàng)建一個JwtUtil工具類來封裝JWT的生成、解析和驗證邏輯:

package com.bookstore.utils;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Component
public class JwtUtil {
    private static final String SECRET_KEY = "bookstore_secret_key";
    private static final long EXPIRATION_TIME = 24 * 60 * 60 * 1000; // 24小時

    // 生成JWT令牌
    public String generateToken(Integer userId, String role) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("userId", userId);
        claims.put("role", role);
        
        return Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(new Date())
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    // 解析JWT令牌
    public Claims parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }

    // 驗證JWT令牌
    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
            return true;
        } catch (Exception e) {
            return false;
        }
    }
}

JWT攔截器實現(xiàn)

創(chuàng)建攔截器來驗證請求中的JWT令牌:

package com.bookstore.config;

import com.bookstore.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class JwtInterceptor implements HandlerInterceptor {

    @Autowired
    private JwtUtil jwtUtil;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 放行OPTIONS請求
        if ("OPTIONS".equals(request.getMethod())) {
            return true;
        }

        // 從請求頭獲取token
        String token = request.getHeader("Authorization");
        if (token != null && token.startsWith("Bearer ")) {
            token = token.substring(7);
            if (jwtUtil.validateToken(token)) {
                Claims claims = jwtUtil.parseToken(token);
                // 將用戶信息存入request屬性中
                request.setAttribute("userId", claims.get("userId"));
                request.setAttribute("role", claims.get("role"));
                return true;
            }
        }
        
        response.setStatus(401);
        return false;
    }
}

MVC配置

配置攔截器并設置攔截路徑:

package com.bookstore.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private JwtInterceptor jwtInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(jwtInterceptor)
                .addPathPatterns("/**")  // 攔截所有路徑
                .excludePathPatterns(    // 排除路徑
                        "/login",
                        "/register",
                        "/swagger-resources/**",
                        "/webjars/**",
                        "/v3/api-docs/**",
                        "/swagger-ui.html/**",
                        "/error",
                        "/favicon.ico",
                        "doc.html",
                        "/logout",
                        "/static/**",
                        "/carousel/list",
                        "/book/new",
                        "/v2/api-docs"
                );
    }
}

使用示例

登錄時生成令牌

在登錄成功后生成JWT令牌并返回給客戶端:

String token = jwtUtil.generateToken(foundUser.getId(), foundUser.getRole());

基礎控制器

創(chuàng)建基礎控制器方便獲取已認證的用戶信息:

import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;

public class BaseController {
    @Autowired
    protected HttpServletRequest request;
    
    // 獲取當前用戶ID
    protected Integer getCurrentUserId() {
        return (Integer) request.getAttribute("userId");
    }
    
    // 獲取當前用戶角色
    protected String getCurrentUserRole() {
        return (String) request.getAttribute("role");
    }

    // 檢查是否是管理員
    protected boolean isAdmin() {
        return "admin".equals(getCurrentUserRole());
    }

    // 檢查是否是普通用戶
    protected boolean isUser() {
        return "user".equals(getCurrentUserRole());
    }
}

其他控制器可以繼承BaseController來方便地獲取用戶信息:

@RestController
@RequestMapping("/api/books")
public class BookController extends BaseController {
    
    @GetMapping("/{id}")
    public ResponseEntity<Book> getBook(@PathVariable Integer id) {
        if (isAdmin()) {
            // 管理員特有邏輯
        }
        // 其他邏輯...
    }
}

總結

  • JWT工具類:封裝了令牌的生成、解析和驗證邏輯
  • 攔截器:自動驗證請求中的JWT令牌并提取用戶信息
  • MVC配置:靈活配置需要攔截和放行的路徑
  • 基礎控制器:提供便捷的方法獲取當前用戶信息

這種實現(xiàn)方式具有以下優(yōu)點:

  • 無狀態(tài)認證,服務端不需要存儲會話信息
  • 跨域支持良好
  • 可以方便地攜帶用戶信息
  • 適合分布式系統(tǒng)

在實際項目中,可以根據(jù)需求調整令牌的有效期、密鑰的存儲方式(如從配置中心獲?。┮约案毜臋嘞蘅刂七壿?。

到此這篇關于Spring Boot整合JWT實現(xiàn)認證與授權的項目實踐的文章就介紹到這了,更多相關Spring Boot JWT認證與授權內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家! 

相關文章

  • 基于spring+quartz的分布式定時任務框架實現(xiàn)

    基于spring+quartz的分布式定時任務框架實現(xiàn)

    在Spring中的定時任務功能,最好的辦法當然是使用Quartz來實現(xiàn)。這篇文章主要介紹了基于spring+quartz的分布式定時任務框架實現(xiàn),有興趣的可以了解一下。
    2017-01-01
  • Java設計模式之訪問者模式

    Java設計模式之訪問者模式

    這篇文章介紹了Java設計模式之訪問者模式,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-10-10
  • SpringBoot使用Thymeleaf模板引擎訪問靜態(tài)html的過程

    SpringBoot使用Thymeleaf模板引擎訪問靜態(tài)html的過程

    這篇文章主要介紹了SpringBoot使用Thymeleaf模板引擎訪問靜態(tài)html的過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Java 通過JDBC連接Mysql數(shù)據(jù)庫

    Java 通過JDBC連接Mysql數(shù)據(jù)庫

    本文給大家詳細介紹了java如何使用JDBC連接Mysql的方法以及驅動包的安裝,最后給大家附上了java通過JDBC連接其他各種數(shù)據(jù)庫的方法,有需要的小伙伴可以參考下。
    2015-11-11
  • idea多環(huán)境配置及問題解決方案

    idea多環(huán)境配置及問題解決方案

    這篇文章主要介紹了idea多環(huán)境配置及問題解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • Spring Security中集成JWT的完整實戰(zhàn)指南

    Spring Security中集成JWT的完整實戰(zhàn)指南

    本文深入探討了現(xiàn)代Web應用中的認證授權方案,對比分析了JWT、Session-Cookie、OAuth2/OIDC、SAML 2.0等主流方案的優(yōu)缺點及適用場景,感興趣的小伙伴可以了解下
    2026-05-05
  • Java單機環(huán)境實現(xiàn)定時任務技術

    Java單機環(huán)境實現(xiàn)定時任務技術

    這篇文章主要介紹了Java單機環(huán)境實現(xiàn)定時任務技術,文章內容介紹詳細,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-04-04
  • Spring Security單項目權限設計過程解析

    Spring Security單項目權限設計過程解析

    這篇文章主要介紹了Spring Security單項目權限設計過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-11-11
  • 解決CentOS7中運行jar包報錯:xxx(Permission?denied)

    解決CentOS7中運行jar包報錯:xxx(Permission?denied)

    在實際工作我們經(jīng)常會在linux上運行Spring boot編寫的微服務程序,下面這篇文章主要給大家介紹了關于如何解決CentOS7中運行jar包報錯:xxx(Permission?denied)的相關資料,需要的朋友可以參考下
    2024-02-02
  • 純Java實現(xiàn)數(shù)字證書生成簽名的簡單實例

    純Java實現(xiàn)數(shù)字證書生成簽名的簡單實例

    下面小編就為大家?guī)硪黄僇ava實現(xiàn)數(shù)字證書生成簽名的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08

最新評論

栾城县| 黔东| 瓦房店市| 宁武县| 古浪县| 吉林省| 神农架林区| 丽江市| 德格县| 兖州市| 吉木乃县| 定南县| 西充县| 桃源县| 吴堡县| 黔西| 山阳县| 台山市| 龙川县| 永嘉县| 渑池县| 乐平市| 宜城市| 湖口县| 中宁县| 黎平县| 丰顺县| 五家渠市| 凌云县| 湖口县| 当雄县| 鸡东县| 仲巴县| 西华县| 东光县| 集贤县| 昌乐县| 西畴县| 高台县| 如皋市| 九龙县|