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

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

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

在Spring Boot中集成JWT(JSON Web Token)是一種常見的身份驗(yàn)證和授權(quán)方式。JWT是一種無狀態(tài)的、基于令牌的認(rèn)證機(jī)制,可以用于保護(hù)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)建一個(gè)工具類來處理JWT的生成、解析和驗(yàn)證。

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小時(shí)
                .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)建一個(gè)SecurityConfig類來配置Spring Security,使其支持JWT認(rèn)證。

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)建一個(gè)JwtRequestFilter類,用于在每個(gè)請求中解析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)建認(rèn)證和授權(quán)接口

創(chuàng)建一個(gè)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)建一個(gè)UserDetailsService實(shí)現(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. 測試

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

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

相關(guān)文章

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

    SpringBoot整合Lombok及常見問題解決

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

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

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

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

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

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

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

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

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

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

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

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

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

    swagger中如何給請求添加header

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

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

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

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

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

最新評論

张北县| 即墨市| 宁陵县| 扎赉特旗| 遂溪县| 滨州市| 修文县| 甘德县| 聊城市| 资阳市| 巩义市| 武安市| 虹口区| 新绛县| 红原县| 三穗县| 美姑县| 城步| 郎溪县| 五大连池市| 淮安市| 金门县| 贵阳市| 咸宁市| 宝丰县| 泰州市| 汉阴县| 嘉鱼县| 湛江市| 正安县| 监利县| 达日县| 五寨县| 祁连县| 翁牛特旗| 星座| 泽州县| 福州市| 千阳县| 汉寿县| 吉林省|