+
95
-

回答

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

网友回复

我知道答案,我要回答