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

使用Spring Security和JWT實現安全認證機制

 更新時間:2024年11月04日 11:23:42   作者:( ????? )920  
在現代 Web 應用中,安全認證和授權是保障數據安全和用戶隱私的核心機制,Spring Security 是 Spring 框架下專為安全設計的模塊,具有高度的可配置性和擴展性,而 JWT則是當前流行的認證解決方案,所以本文介紹了如何使用Spring Security和JWT實現安全認證機制

引言

在現代 Web 應用中,安全認證和授權是保障數據安全和用戶隱私的核心機制。Spring Security 是 Spring 框架下專為安全設計的模塊,具有高度的可配置性和擴展性。而 JWT(JSON Web Token) 則是當前流行的認證解決方案,因其無狀態(tài)、可擴展性強等特點被廣泛應用于微服務和移動應用中。

本文將從以下幾個部分詳細介紹如何使用 Spring Security 和 JWT 實現一個完整的認證機制:

  1. JWT 認證流程概述
  2. Spring Security 的基本配置
  3. JWT 生成與解析
  4. 基于 Spring Security 的 JWT 安全配置
  5. 實現用戶登錄和認證

1. JWT 認證流程概述

JWT 的認證流程如下:

  • 用戶登錄:用戶通過用戶名和密碼發(fā)送請求給服務器。
  • 服務器驗證:服務器驗證用戶身份,驗證通過后生成 JWT Token。
  • Token 下發(fā):服務器將生成的 Token 返回給客戶端。
  • 后續(xù)請求攜帶 Token:客戶端在后續(xù)請求中將 JWT Token 添加到請求頭中,服務器通過解析和驗證 Token 確認請求的合法性。

這種方式的核心優(yōu)勢在于 Token 是無狀態(tài)的,服務器無需維護用戶的會話信息,且 JWT 可在分布式系統(tǒng)中實現共享認證。

2. Spring Security 的基本配置

創(chuàng)建一個簡單的 Spring Boot 項目,并添加 Spring Security 和 JWT 的依賴:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>
</dependencies>

配置 SecurityConfig 類

創(chuàng)建 SecurityConfig 類以配置 Spring Security 基本設置:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/login").permitAll()
            .anyRequest().authenticated();
    }
}

上面的配置指定 /login 接口公開訪問,其余接口需要認證后才能訪問。

3. JWT 生成與解析

使用 JWT 庫生成和解析 Token。創(chuàng)建 JwtUtil 工具類,實現生成和驗證 JWT 的方法:

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;

public class JwtUtil {

    private static final String SECRET_KEY = "mySecretKey";

    // 生成 JWT
    public static String generateToken(String username) {
        return Jwts.builder()
                   .setSubject(username)
                   .setIssuedAt(new Date())
                   .setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 24小時有效期
                   .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                   .compact();
    }

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

4. 基于 Spring Security 的 JWT 安全配置

在 Spring Security 過濾鏈中添加 JWT 過濾器。實現一個 JwtAuthenticationFilter 類,在每次請求時攔截并驗證 Token:

import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
import io.jsonwebtoken.Claims;

public class JwtAuthenticationFilter extends BasicAuthenticationFilter {

    public JwtAuthenticationFilter(AuthenticationManager authManager) {
        super(authManager);
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws IOException, ServletException {

        String token = request.getHeader("Authorization");
        if (token == null || !token.startsWith("Bearer ")) {
            chain.doFilter(request, response);
            return;
        }

        Claims claims = JwtUtil.parseToken(token.replace("Bearer ", ""));
        String username = claims.getSubject();

        if (username != null) {
            UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());
            SecurityContextHolder.getContext().setAuthentication(auth);
        }
        chain.doFilter(request, response);
    }
}

將 JwtAuthenticationFilter 過濾器添加到 SecurityConfig 中:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.csrf().disable()
        .authorizeRequests()
        .antMatchers("/login").permitAll()
        .anyRequest().authenticated()
        .and()
        .addFilter(new JwtAuthenticationFilter(authenticationManager()));
}

5. 實現用戶登錄和認證

創(chuàng)建一個登錄控制器 AuthController,驗證用戶后生成 JWT:

import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;

@RestController
public class AuthController {

    @PostMapping("/login")
    public void login(@RequestParam String username, @RequestParam String password, HttpServletResponse response) {
        // 這里簡單校驗用戶名密碼
        if ("user".equals(username) && "password".equals(password)) {
            String token = JwtUtil.generateToken(username);
            response.setHeader("Authorization", "Bearer " + token);
        } else {
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        }
    }
}

以上代碼實現了一個簡單的登錄接口,用戶登錄成功后將返回 JWT Token,并將該 Token 存儲在響應頭中。

6. 測試與驗證

  1. 獲取 Token:使用客戶端(例如 Postman)請求 /login 接口,得到包含 JWT Token 的響應頭。
  2. 訪問受保護接口:將 Token 添加到請求頭 Authorization 中,再次請求受保護接口,驗證是否可以成功訪問。

結論

通過以上步驟,我們實現了一個基于 Spring Security 和 JWT 的安全認證系統(tǒng)。在實際項目中,可以進一步擴展此功能,例如集成數據庫實現用戶管理、配置 JWT 自動續(xù)簽等。這種基于 JWT 的無狀態(tài)認證適用于分布式系統(tǒng)和微服務架構,有助于提高系統(tǒng)的安全性和可擴展性。

以上就是使用Spring Security和JWT實現安全認證機制的詳細內容,更多關于Spring Security JWT安全認證的資料請關注腳本之家其它相關文章!

相關文章

  • Log4j日志記錄框架配置及用法解析

    Log4j日志記錄框架配置及用法解析

    這篇文章主要介紹了Log4j日志記錄框架配置及用法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • Spring容器管理Jar包內XML Bean的5種方式

    Spring容器管理Jar包內XML Bean的5種方式

    在 Spring 項目中,Jar 包內的 XML 配置文件默認不會被 Spring 自動加載,需要手動指定加載路徑,讓容器掃描并管理其中的 Bean,本文給大家整理了最常用、最實用的 5種方式,需要的朋友可以參考下
    2026-03-03
  • Java實現簡易學生管理系統(tǒng)

    Java實現簡易學生管理系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現簡易學生管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • Java對象存儲內存布局詳解

    Java對象存儲內存布局詳解

    眾所周知,Java是一門面向對象的語言,那么一個對象在內存中都包含什么東西呢,本文主要詳細介紹了Java對象的內存布局,訪問定位,創(chuàng)建過程,線程安全,感興趣的小伙伴可以跟著小編一起來學習
    2023-04-04
  • JsonObject的屬性與值的判空(Null值)處理方式

    JsonObject的屬性與值的判空(Null值)處理方式

    這篇文章主要介紹了JsonObject的屬性與值的判空(Null值)處理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • spring boot 防止重復提交實現方法詳解

    spring boot 防止重復提交實現方法詳解

    這篇文章主要介紹了spring boot 防止重復提交實現方法,結合實例形式詳細分析了spring boot 防止重復提交具體配置、實現方法及操作注意事項,需要的朋友可以參考下
    2019-11-11
  • Java Springboot整合支付寶接口的教程詳解

    Java Springboot整合支付寶接口的教程詳解

    這篇文章主要為大家詳細介紹了Java Springboot實現整合支付寶接口的教程,文中的示例代碼講解詳細,具有一定的參考價值,需要的可以參考一下
    2023-02-02
  • SpringBoot項目使用mybatis-plus代碼生成的實例詳解

    SpringBoot項目使用mybatis-plus代碼生成的實例詳解

    mybatis-plus是mybatis的增強,不對mybatis做任何改變,涵蓋了代碼生成,自定義ID生成器,快速實現CRUD,自動分頁,邏輯刪除等功能。本文就來講講SpringBoot項目如何使用mybatis-plus實現代碼生成,需要的可以了解一下
    2022-10-10
  • Java中冒泡排序的原生實現方法(正序與逆序)

    Java中冒泡排序的原生實現方法(正序與逆序)

    這篇文章主要給大家介紹了關于Java中冒泡排序的原生實現方法(正序與逆序)的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • JAVA 繼承基本類、抽象類、接口介紹

    JAVA 繼承基本類、抽象類、接口介紹

    Java是一個面向對象的語言,java面向對象一般有三大特征:封裝、繼承、多態(tài)
    2013-01-01

最新評論

仲巴县| 和平县| 邵阳县| 会宁县| 鹤岗市| 扶余县| 广平县| 岫岩| 陇南市| 柏乡县| 阿克陶县| 车致| 房产| 深泽县| 白水县| 礼泉县| 五指山市| 石首市| 新巴尔虎右旗| 武邑县| 昭苏县| 廉江市| 嵊州市| 城固县| 德化县| 德令哈市| 邓州市| 关岭| 冕宁县| 忻州市| 道孚县| 河西区| 沙坪坝区| 铜陵市| 恭城| 铜鼓县| 桃园县| 五河县| 邵阳县| 渭南市| 康保县|