计算机系统应用教程网站

网站首页 > 技术文章 正文

在 Spring Boot 应用程序中实现 JWT 身份验证

btikc 2024-10-13 01:51:11 技术文章 9 ℃ 0 评论

JSON Web Tokens(JWT)已经成为现代Web应用安全防护的热门选择。JWT允许作为一个紧凑、独立且经过数字签名的JSON对象,安全地在各方之间传递信息。本篇博客文章将指导您在Spring Boot应用中实施JWT认证的步骤。

步骤1:创建Spring Boot项目

利用您喜欢的IDE或通过Spring Initializr(https://start.spring.io/)来创建一个新的Spring Boot项目。

步骤2:添加依赖

首先,您需要在pom.xml文件中添加必要的依赖。本例中,我们将采用Spring Security和jjwt库来支持JWT。您的依赖部分应如下所示:

<dependencies>
    <!-- Spring Boot Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <!-- Spring Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <!-- JWT Library -->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version> <!-- Use the latest version available -->
    </dependency>
</dependencies>

步骤3:配置Spring Security

创建一个继承自WebSecurityConfigurerAdapter的安全配置类。在该类中,设置包括认证和授权规则在内的安全配置。同时,需要将登录和令牌端点从认证中排除,以便允许未认证的访问。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
            .antMatchers("/login", "/token").permitAll() // Exclude login and token endpoints from authentication
            .anyRequest().authenticated();
    }
}

步骤4:创建UserDetailsService

实现一个自定义UserDetailsService,用于从您选择的数据源(例如数据库)中加载用户信息。

步骤5:创建JWT工具类

开发一个利用jjwt库的工具类,用于生成和解析JWT。该类负责在用户登录时创建JWT,以及验证传入的JWT。

import io.jsonwebtoken.*;
public class JwtUtil {
    private static final String SECRET = "your-secret-key";
    private static final long EXPIRATION_TIME = 864_000_000; // 10 days
    public static String generateToken(String username) {
        return Jwts.builder()
            .setSubject(username)
            .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
            .signWith(SignatureAlgorithm.HS512, SECRET)
            .compact();
    }
    public static String extractUsername(String token) {
        return Jwts.parser()
            .setSigningKey(SECRET)
            .parseClaimsJws(token)
            .getBody()
            .getSubject();
    }
}

步骤6:创建登录端点

设置一个端点,使用户能够登录并获得JWT。以下是一个简单例子,展示了如何使用@RestController实现它:

@RestController
public class AuthController {
    @PostMapping("/login")
    public String login(@RequestBody LoginRequest request) {
        // Authenticate the user (e.g., using Spring Security's authentication manager)
        // If authentication is successful, generate a JWT
        String token = JwtUtil.generateToken(request.getUsername());
        return token;
    }
}

步骤7:创建受保护资源端点

开发一个端点,它要求访问者提供有效的JWT才能访问。利用Spring Security的注解来根据角色或其他标准执行授权。

@RestController
public class ProtectedResourceController {

    @GetMapping("/protected")
    @Secured("ROLE_USER") // Role-based authorization
    public String protectedResource() {
        return "This is a protected resource.";
    }
}

步骤8:令牌验证和认证过滤器

实施一个自定义过滤器,用于截取传入请求、验证JWT,并在令牌有效时建立认证上下文。你可以利用Spring Security的OncePerRequestFilter来完成这一任务。

步骤9:测试您的端点

可以使用Postman或cURL工具来测试登录和受保护资源的端点。访问受保护资源时,确保请求头中包含JWT。

步骤10:安全地存储秘钥

确保安全地存储您的JWT秘钥。考虑使用属性文件、环境变量或密钥管理工具来保护这一敏感信息。

步骤11:处理令牌过期和刷新

(可选) 根据您的应用需求,您可能需要实现令牌的过期和刷新机制。

步骤12:日志与错误处理

确保您的应用包含合适的日志记录和错误处理机制,以有效应对安全问题。

感谢您的阅读!如果您对本文有任何疑问或想要分享您的看法,请随时通过私信或在下方评论区与我交流。

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表