1. 什么是JWT?
在我们深入研究整合过程之前,让我们先来了解一下JWT。
JWT: 是一种用于在网络上安全地传递声明的开放标准(RFC 7519)。它由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。JWT通常用于在用户和服务器之间传递身份信息,并确保信息的完整性和安全性。
2. 创建Spring Boot项目
首先,我们需要创建一个Spring Boot项目。你可以使用Spring Initializer(https://start.spring.io/)进行项目的初始化,选择相应的依赖,包括Spring Web等。
3. 引入JWT依赖
在项目的pom.xml
文件中,添加JWT的依赖:
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.2</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.2</version> <scope>runtime</scope> </dependency>
请确保将0.11.2
替换为JWT的最新版本号。
4. 配置JWT
在application.properties
或application.yml
中配置JWT的密钥等信息:
jwt: secret-key: your-secret-key expiration: 3600 token-prefix: Bearer
5. 创建JWT工具类
编写一个用于生成和解析JWT的工具类,例如:
@Component public class JwtUtils { @Value("${jwt.secret-key}") private String secretKey; @Value("${jwt.expiration}") private int expiration; public String generateToken(UserDetails userDetails) { Date now = new Date(); Date expiryDate = new Date(now.getTime() + expiration * 1000); return Jwts.builder() .setSubject(userDetails.getUsername()) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS512, secretKey) .compact(); } public String getUsernameFromToken(String token) { return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject(); } public boolean validateToken(String token, UserDetails userDetails) { String username = getUsernameFromToken(token); return username.equals(userDetails.getUsername()) && !isTokenExpired(token); } private boolean isTokenExpired(String token) { Date expirationDate = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getExpiration(); return expirationDate.before(new Date()); } }
6. 创建身份验证接口
编写一个Controller类,用于处理用户登录和生成JWT:
@RestController @RequestMapping("/auth") public class AuthController { @Autowired private AuthenticationManager authenticationManager; @Autowired private JwtUtils jwtUtils; @PostMapping("/login") public ResponseEntity<?> authenticateUser(@RequestBody AuthRequest authRequest) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken(authRequest.getUsername(), authRequest.getPassword()) ); SecurityContextHolder.getContext().setAuthentication(authentication); UserDetails userDetails = (UserDetails) authentication.getPrincipal(); String token = jwtUtils.generateToken(userDetails); return ResponseEntity.ok(new AuthResponse(token)); } }
7. 运行和测试
完成上述步骤后,你可以运行Spring Boot应用程序,并使用POST请求/auth/login
接口进行用户登录,成功后将会返回生成的JWT Token。你可以将Token用于后续的API请求,在Header中加入Authorization: Bearer your-token
进行身份验证。
结语
通过以上简单的步骤,我们成功地将Spring Boot与JWT整合在一起,为我们的应用程序提供了安全可靠的用户认证机制。希望这篇文章对你在项目中使用JWT时有所帮助。