springboot jwt token前后端分离_前后端分离之JWT用户认证
时间: 2023-08-31 10:09:26 浏览: 182
JWT(JSON Web Token)是一种基于 JSON 的安全令牌,它可以在客户端和服务器之间安全传输信息。在前后端分离的项目中,使用 JWT 进行用户认证可以方便地处理用户登录和权限控制。
以下是使用 Spring Boot 和 JWT 实现前后端分离的用户认证示例:
1. 添加依赖
在 pom.xml 中添加以下依赖:
```xml
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
```
2. 创建 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;
public String generateToken(String username) {
Map<String, Object> claims = new HashMap<>();
claims.put("sub", username);
claims.put("iat", new Date());
return Jwts.builder()
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
public String getUsernameFromToken(String token) {
try {
Claims claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
} catch (Exception e) {
return null;
}
}
public boolean validateToken(String token, String username) {
String tokenUsername = getUsernameFromToken(token);
return tokenUsername != null && tokenUsername.equals(username);
}
}
```
3. 创建登录接口
创建一个登录接口,用于验证用户的用户名和密码,并返回 JWT:
```java
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword()));
SecurityContextHolder.getContext().setAuthentication(authentication);
String jwt = jwtUtils.generateToken(authentication.getName());
return ResponseEntity.ok(new JwtResponse(jwt));
}
```
4. 创建受保护的接口
创建一个受保护的接口,需要用户在请求头中传递 JWT。在该接口中,首先验证 JWT 是否有效,然后根据用户角色返回相应的数据:
```java
@GetMapping("/data")
@PreAuthorize("hasAnyRole('USER', 'ADMIN')")
public ResponseEntity<?> getData() {
String username = SecurityContextHolder.getContext().getAuthentication().getName();
if (jwtUtils.validateToken(jwt, username)) {
// 返回数据
} else {
throw new BadCredentialsException("Invalid JWT");
}
}
```
5. 配置 JWT 相关属性
在 application.properties 中配置 JWT 相关属性:
```
jwt.secret=mySecret
jwt.expiration=86400000 # 1 day in milliseconds
```
以上就是使用 Spring Boot 和 JWT 实现前后端分离的用户认证的示例。需要注意的是,JWT 本身并没有提供加密功能,因此需要使用一个密钥来保证 JWT 的安全性。在示例中,密钥存储在配置文件中,实际生产环境中应该使用更加安全的方式来存储密钥。
阅读全文