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

Spring Boot集成JWT實現(xiàn)無狀態(tài)認證與授權(quán)方式

 更新時間:2025年11月18日 09:27:13   作者:軟件職業(yè)規(guī)劃  
本文介紹了如何在SpringBoot中集成JWT實現(xiàn)無狀態(tài)認證與授權(quán),主要步驟包括添加依賴、配置JWT工具類、配置SpringSecurity、創(chuàng)建JWT請求過濾器、創(chuàng)建認證和授權(quán)接口、創(chuàng)建用戶詳情服務(wù)以及配置JWT密鑰,本文給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧

在Spring Boot中集成JWT(JSON Web Token)是一種常見的身份驗證和授權(quán)方式。JWT是一種無狀態(tài)的、基于令牌的認證機制,可以用于保護API接口的安全性。

1. 添加依賴

首先,在pom.xml文件中添加JWT相關(guān)的依賴。通常使用java-jwt庫或JJWT庫。這里以JJWT為例:

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>

如果使用Spring Security,還需要添加Spring Security的依賴:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 配置JWT工具類

創(chuàng)建一個工具類來處理JWT的生成、解析和驗證。

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
@Component
public class JwtUtil {
    @Value("${jwt.secret}")
    private String secret;
    public String extractUsername(String token) {
        return extractClaim(token, Claims::getSubject);
    }
    public Date extractExpiration(String token) {
        return extractClaim(token, Claims::getExpiration);
    }
    public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
        final Claims claims = extractAllClaims(token);
        return claimsResolver.apply(claims);
    }
    private Claims extractAllClaims(String token) {
        return Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
    }
    private Boolean isTokenExpired(String token) {
        return extractExpiration(token).before(new Date());
    }
    public String generateToken(String username) {
        Map<String, Object> claims = new HashMap<>();
        return createToken(claims, username);
    }
    private String createToken(Map<String, Object> claims, String subject) {
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(new Date(System.currentTimeMillis()))
                .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) // 10小時
                .signWith(SignatureAlgorithm.HS256, secret)
                .compact();
    }
    public Boolean validateToken(String token, String username) {
        final String extractedUsername = extractUsername(token);
        return (extractedUsername.equals(username) && !isTokenExpired(token));
    }
}

3. 配置Spring Security

創(chuàng)建一個SecurityConfig類來配置Spring Security,使其支持JWT認證。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
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;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private JwtRequestFilter jwtRequestFilter;
    @Autowired
    private UserDetailsService userDetailsService;
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
                .csrf().disable()
                .authorizeRequests()
                .antMatchers("/authenticate").permitAll()
                .anyRequest().authenticated()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
       .add httpFilterBefore(jwtRequestFilter, UsernamePasswordAuthenticationFilter.class);
    }
    @Override
    @Bean
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

4. 創(chuàng)建JWT請求過濾器

創(chuàng)建一個JwtRequestFilter類,用于在每個請求中解析JWT,并將其設(shè)置到Spring Security上下文中。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class JwtRequestFilter extends OncePerRequestFilter {
    @Autowired
    private JwtUtil jwtUtil;
    @Autowired
    private UserDetailsService userDetailsService;
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        final String authorizationHeader = request.getHeader("Authorization");
        String username = null;
        String jwt = null;
        if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) {
            jwt = authorizationHeader.substring(7);
            username = jwtUtil.extractUsername(jwt);
        }
        if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {
            UserDetails userDetails = userDetailsService.loadUserByUsername(username);
            if (jwtUtil.validateToken(jwt, userDetails.getUsername())) {
                UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
                        userDetails, null, userDetails.getAuthorities());
                usernamePasswordAuthenticationToken
                        .setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
                SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
            }
        }
        chain.doFilter(request, response);
    }
}

5. 創(chuàng)建認證和授權(quán)接口

創(chuàng)建一個AuthenticationController類,用于處理用戶登錄和生成JWT。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api")
public class AuthenticationController {
    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private JwtUtil jwtUtil;
    @Autowired
    private UserDetailsService userDetailsService;
    @PostMapping("/authenticate")
    public ResponseEntity<?> createAuthenticationToken(@RequestBody AuthenticationRequest authenticationRequest) throws Exception {
        try {
            authenticationManager.authenticate(
                    new UsernamePasswordAuthenticationToken(authenticationRequest.getUsername(), authenticationRequest.getPassword())
            );
        } catch (BadCredentialsException e) {
            throw new Exception("Incorrect username or password", e);
        }
        final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername());
        final String jwt = jwtUtil.generateToken(userDetails.getUsername());
        return ResponseEntity.ok(new AuthenticationResponse(jwt));
    }
}

6. 創(chuàng)建用戶詳情服務(wù)

創(chuàng)建一個UserDetailsService實現(xiàn)類,用于加載用戶信息。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username)
                .orElseThrow(() -> new UsernameNotFoundException("User not found with username: " + username));
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
    }
}

7. 配置application.properties

application.properties文件中配置JWT密鑰。

jwt.secret=yourSecretKey

8. 測試

啟動應(yīng)用后,可以通過發(fā)送POST請求到/api/authenticate接口進行登錄,獲取JWT。然后在請求頭中添加Authorization: Bearer <token>,即可訪問受保護的接口。

到此這篇關(guān)于Spring Boot集成JWT實現(xiàn)無狀態(tài)認證與授權(quán)的文章就介紹到這了,更多相關(guān)Spring Boot JWT無狀態(tài)認證與授權(quán)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot整合Lombok及常見問題解決

    SpringBoot整合Lombok及常見問題解決

    本文主要介紹了SpringBoot整合Lombok及常見問題解決,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java 對 Cookie增刪改查的實現(xiàn)示例

    Java 對 Cookie增刪改查的實現(xiàn)示例

    這篇文章主要介紹了Java 對 Cookie增刪改查的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • SpringBoot整合Xxl-Job的完整步驟記錄

    SpringBoot整合Xxl-Job的完整步驟記錄

    這篇文章主要給大家介紹了關(guān)于SpringBoot整合Xxl-Job的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Mybatis如何獲取insert新增數(shù)據(jù)id值

    Mybatis如何獲取insert新增數(shù)據(jù)id值

    這篇文章主要介紹了Mybatis如何獲取insert新增數(shù)據(jù)id值問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案

    Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案

    這篇文章主要介紹了Feign遠程調(diào)用參數(shù)里面內(nèi)容丟失的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • MybatisPlus?BaseMapper?實現(xiàn)對數(shù)據(jù)庫增刪改查源碼

    MybatisPlus?BaseMapper?實現(xiàn)對數(shù)據(jù)庫增刪改查源碼

    MybatisPlus?是一款在?Mybatis?基礎(chǔ)上進行的增強?orm?框架,可以實現(xiàn)不寫?sql?就完成數(shù)據(jù)庫相關(guān)的操作,這篇文章主要介紹了MybatisPlus?BaseMapper?實現(xiàn)對數(shù)據(jù)庫增刪改查源碼解析,需要的朋友可以參考下
    2023-01-01
  • SpringBoot 整合 Shiro 密碼登錄的實現(xiàn)代碼

    SpringBoot 整合 Shiro 密碼登錄的實現(xiàn)代碼

    這篇文章主要介紹了SpringBoot 整合 Shiro 密碼登錄的實現(xiàn),本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • swagger中如何給請求添加header

    swagger中如何給請求添加header

    這篇文章主要介紹了swagger中如何給請求添加header,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java中IO多路復(fù)用技術(shù)的用法解讀

    Java中IO多路復(fù)用技術(shù)的用法解讀

    本文詳細介紹了Java中的IO多路復(fù)用機制,包括阻塞IO、非阻塞IO(NIO)和異步IO(AIO)的不同,并重點講解了Java?NIO的核心組件:通道(Channel)、緩沖區(qū)(Buffer)和選擇器(Selector),通過實際代碼示例,展示了如何使用NIO實現(xiàn)高效的多客戶端服務(wù)器
    2025-11-11
  • spring boot的攔截器簡單使用示例代碼

    spring boot的攔截器簡單使用示例代碼

    這篇文章主要介紹了spring boot的攔截器簡單使用實例代碼,需要的的朋友參考下吧
    2017-04-04

最新評論

司法| 青铜峡市| 德兴市| 红河县| 正镶白旗| 通河县| 化州市| 长岛县| 桂阳县| 新宾| 铜鼓县| 屯留县| 富顺县| 宝坻区| 呼图壁县| 滨州市| 呼玛县| 桂平市| 工布江达县| 苗栗市| 岳西县| 屯昌县| 八宿县| 祥云县| 陆良县| 察雅县| 都兰县| 新源县| 阳城县| 伊金霍洛旗| 永和县| 阿克| 景东| 武胜县| 上林县| 原阳县| 法库县| 桐梓县| 新余市| 门头沟区| 弥渡县|