在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的有效期,防止安全风险。
网友回复