在Spring Boot应用中使用JWT(JSON Web Token)来存储会话信息是一种常见的做法,尤其适合构建无状态的RESTful API。下面是如何在Spring Boot中使用JWT进行会话管理的基本步骤:
1. 添加依赖首先,你需要在pom.xml中添加JWT库的依赖。常用的库有jjwt和Spring Security。以下是使用jjwt的示例:
<dependencies>
<!-- Spring Boot Starter Security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- Java JWT: JSON Web Token for Java and Android -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
</dependencies> 2. 配置Spring Security创建一个WebSecurityConfig类来配置Spring Security,包括禁用CSRF(跨站请求伪造保护),配置HTTP请求的安全访问规则,以及配置自定义的用户认证和授权。
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/api/auth/**").permitAll() // 允许所有人访问认证相关的API
.anyRequest().authenticated(); // 其他所有请求都需要认证
// 可以添加更多配置,例如自定义的JWT过滤器
}
} 3. 实现JWT的生成和验证创建一个工具类JwtTokenProvider来生成和验证JWT。这个类将负责创建JWT,解析JWT,以及验证JWT的有效性。
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtTokenProvider {
// 密钥,实际使用时应保证其安全性,可以通过配置文件读取
private static final String SECRET_KEY = "your_secret_key";
// 生成JWT
public String generateToken(String username) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + 3600000); // 有效期1小时
return Jwts.builder()
.setSubject(username)
.setIssuedAt(new Date())
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512, SECRET_KEY)
.compact();
}
// 验证JWT
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token);
return true;
} catch (Exception e) {
// 处理异常,例如过期、签名错误等
}
return false;
}
// 从JWT获取用户名(或其他信息)
public String getUsernameFromJWT(String token) {
return Jwts.parser()
.setSigningKey(SECRET_KEY)
.parseClaimsJws(token)
.getBody()
.getSubject();
}
} 4. 实现认证和授权逻辑在你的认证控制器中,使用JwtTokenProvider来在用户登录成功后生成JWT,并在需要验证用户身份的地方验证JWT。
@RestController
@RequestMapping("/api/auth")
public class AuthController {
@Autowired
private JwtTokenProvider tokenProvider;
@PostMapping("/login")
public ResponseEntity<?> authenticateUser(@RequestBody LoginRequest loginRequest) {
// 执行认证逻辑,例如使用Spring Security的认证管理器
// 如果认证成功:
String jwt = tokenProvider.generateToken(loginRequest.getUsername());
return ResponseEntity.ok(new JwtAuthenticationResponse(jwt));
}
} 5. 配置JWT过滤器你可能还需要实现一个过滤器,用于拦截请求并从中提取JWT,然后设置认证信息到Spring Security的上下文中。这样,你就可以在你的应用中通过Spring Security的方式来获取当前用户的信息。
总结通过以上步骤,你可以在Spring Boot应用中使用JWT来管理用户会话。这种方式适合无状态的应用,可以提高应用的安全性和扩展性。不过,要注意保护好密钥,以及合理设置JWT的有效期,防止安全风险。
网友回复


