给我一个教程。
时间: 2023-08-14 09:03:20 浏览: 22
好的,下面是一个简单的 Spring Boot 集成 JWT 的教程:
1. 添加依赖
在 `pom.xml` 文件中添加以下依赖:
```xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
```
2. 配置 JWT
在 `application.properties` 文件中添加以下属性:
```
# JWT
jwt.secret=your_secret_key
jwt.expiration=86400
```
`jwt.secret` 是用来加密 JWT 的密钥,`jwt.expiration` 是 JWT 的过期时间(单位为秒)。
3. 创建 JWT 工具类
创建一个 JWT 工具类,实现生成和验证 JWT 的方法:
```java
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;
@Component
public class JwtUtils {
@Value("${jwt.secret}")
private String secret;
@Value("${jwt.expiration}")
private Long expiration;
/**
* 生成 JWT
*/
public String generateToken(String subject) {
Map<String, Object> claims = new HashMap<>();
claims.put("sub", subject);
Date now = new Date();
Date expirationDate = new Date(now.getTime() + expiration * 1000);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(now)
.setExpiration(expirationDate)
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
/**
* 验证 JWT
*/
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(secret).parseClaimsJws(token);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 获取 JWT 中的数据
*/
public String getSubjectFromToken(String token) {
Claims claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();
return claims.getSubject();
}
}
```
4. 创建登录接口
在 Spring Boot 中创建一个登录接口,用来验证用户名和密码,并生成 JWT:
```java
@RestController
@RequestMapping("/auth")
public class AuthController {
@Autowired
private JwtUtils jwtUtils;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody User user) {
// 验证用户名和密码
if (user.getUsername().equals("admin") && user.getPassword().equals("admin")) {
// 生成 JWT
String token = jwtUtils.generateToken(user.getUsername());
return ResponseEntity.ok(new AuthResponse(token));
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
}
```
5. 创建需要身份验证的接口
在 Spring Boot 中创建一个需要身份验证的接口,只有在 JWT 有效的情况下才能访问:
```java
@RestController
@RequestMapping("/api")
public class ApiController {
@Autowired
private JwtUtils jwtUtils;
@GetMapping("/user")
public ResponseEntity<?> getUserInfo(@RequestHeader("Authorization") String authorization) {
// 获取 JWT
String token = authorization.substring(7);
// 验证 JWT
if (jwtUtils.validateToken(token)) {
// 获取 JWT 中的数据
String username = jwtUtils.getSubjectFromToken(token);
User user = new User(username, "******");
return ResponseEntity.ok(user);
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
}
```
6. 测试
启动 Spring Boot 应用,使用 Postman 或者其他工具访问登录接口 `/auth/login`,传入用户名和密码,成功后会返回一个 JWT,例如:
```
{
"token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYxMDY5NjAyMiwiZXhwIjoxNjEwNzAzMjIyfQ.0kOezsPNNxXW3Lj5p2R1j8Mjv5bY1aKtV4xxeXnTJG3Rt1NlCj6nJUc8yfIjJp5uKbmkR-fVU4P4nQD7GMJfpg"
}
```
然后访问需要身份验证的接口 `/api/user`,在请求头中添加 `Authorization: Bearer your_jwt_token`,例如:
```
Authorization: Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJhZG1pbiIsImlhdCI6MTYxMDY5NjAyMiwiZXhwIjoxNjEwNzAzMjIyfQ.0kOezsPNNxXW3Lj5p2R1j8Mjv5bY1aKtV4xxeXnTJG3Rt1NlCj6nJUc8yfIjJp5uKbmkR-fVU4P4nQD7GMJfpg
```
如果 JWT 有效,则会返回用户信息:
```
{
"username": "admin",
"password": "******"
}
```
如果 JWT 无效,则会返回 `401 Unauthorized`。
相关推荐


















