Spring Boot Json Web Token (JWT)

在現代的Web應用程序中,一種安全的身份驗證機制是必不可少的。其中最流行的是使用Token的身份驗證機制,而Json Web Token (JWT)則是其中最常用的一種標準。在Spring Boot中,我們可以通過使用Spring Security和JWT來實現該機制。

一、Spring Boot JWT Token

在Spring Boot中,我們可以通過使用JwtHelper類來生成和解析JWT Token。例如:

@Configuration
public class JwtHelper {

    private static final String JWT_SECRET = "mySecretKey";
    private static final long JWT_EXPIRATION = 86400000;

    public static String generateToken(String username) {

        return Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + JWT_EXPIRATION))
                .signWith(SignatureAlgorithm.HS512, JWT_SECRET)
                .compact();
    }

    public static String getUsernameFromToken(String token) {

        return Jwts.parser().setSigningKey(JWT_SECRET).parseClaimsJws(token).getBody().getSubject();
    }
}

該類包含了生成和解析JWT Token所需的方法。我們可以通過傳遞用戶名來生成JWT Token,而使用JWT Token和密鑰,我們可以獲取其中包含的用戶名。

二、Spring Boot JWT Security

Spring Security是Spring Boot中用於提供安全性的框架。在與JWT Token結合使用時,我們可以通過自定義一個JwtAuthenticationFilter來提供身份驗證機制。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtAuthenticationProvider jwtAuthenticationProvider;

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.csrf().disable().authorizeRequests()
                .antMatchers("/api/login").permitAll()
                .anyRequest().authenticated()
                .and()
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                .and()
                .addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {

        auth.authenticationProvider(jwtAuthenticationProvider);
    }

    @Bean
    public PasswordEncoder passwordEncoder() {

        return new BCryptPasswordEncoder();
    }
}

在上面的代碼示例中,我們自定義了一個JwtAuthenticationFilter,它繼承了OncePerRequestFilter類,並且在請求中提取JWT Token並通過CustomAuthenticationManager進行身份驗證。

@Component
public class JwtAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {

        String token = authentication.getName();

        String username = JwtHelper.getUsernameFromToken(token);

        if (username == null) {
            throw new BadCredentialsException("Invalid token");
        }

        return new UsernamePasswordAuthenticationToken(username, "", new ArrayList());
    }

    @Override
    public boolean supports(Class authentication) {
        return authentication.equals(UsernamePasswordAuthenticationToken.class);
    }
}

在上面的代碼示例中,我們自定義了一個JwtAuthenticationProvider,它繼承了AuthenticationProvider類,並使用JwtHelper類獲取了JWT Token中的用戶名。如果用戶名無效,則拋出BadCredentialsException異常。

三、小結

在Spring Boot中,我們可以使用Spring Security和JWT來實現安全的身份驗證機制。在使用JWT時,我們可以使用JwtHelper類來生成和解析JWT Token,而在與Spring Security結合使用時,我們可以通過自定義一個JwtAuthenticationFilter並使用JwtAuthenticationProvider進行身份驗證。通過應用這些技術,我們可以保證Web應用程序的安全性。

原創文章,作者:GMQRO,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/362048.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GMQRO的頭像GMQRO
上一篇 2025-02-25 18:17
下一篇 2025-02-25 18:17

相關推薦

發表回復

登錄後才能評論