网站首页 > 技术文章 正文
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:日志与错误处理
确保您的应用包含合适的日志记录和错误处理机制,以有效应对安全问题。
感谢您的阅读!如果您对本文有任何疑问或想要分享您的看法,请随时通过私信或在下方评论区与我交流。
猜你喜欢
- 2024-10-13 谈谈springboot 获取前端json数据几种方法
- 2024-10-13 在Spring Boot中如何获取到Request对象?
- 2024-10-13 SpringBoot:如何优雅地进行响应数据封装、异常处理
- 2024-10-13 SpringBoot实现接口防抖的几种方案,杜绝重复提交
- 2024-10-13 @PostMapping @GetMapping注解 postmapping注解接收参数
- 2024-10-13 如何在SpringBoot中动态过滤JSON响应正文
- 2024-10-13 WebSocket 集群解决方案 websocket500
- 2024-10-13 SpringBoot跨系统调用接口方案 springboot跨越设置
- 2024-10-13 SpringBoot如何优雅的进行参数校验(一)
- 2024-10-13 IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)