Spring Security 是一个强大的安全框架,它提供了各种认证和授权的功能。JWT(Json Web Token)作为一种无状态的令牌机制,可以在分布式系统中用于身份验证和授权。在使用 Spring Security 进行 JWT 认证和授权时,需要进行如下步骤:

1. 添加依赖

首先,需要在项目的 pom.xml 文件中添加 Spring Security 和 JWT 的依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.11.2</version>
</dependency>
XML

2. 配置 Security

接下来,在 Spring Boot 的配置文件中配置 Spring Security:

spring:
  security:
    jwt:
      secret: mySecretKey
      expiration: 86400
      token-prefix: Bearer
      header-string: Authorization
.properties

配置中可以设置 JWT 的 secret 密钥、过期时间、令牌前缀和请求头标识。

3. 创建 JwtTokenProvider

然后,需要创建一个 JwtTokenProvider 类,用于生成和验证 JWT 令牌:

public class JwtTokenProvider {
    private final String secretKey;
    private final long expiration;

    public JwtTokenProvider(String secretKey, long expiration) {
        this.secretKey = secretKey;
        this.expiration = expiration;
    }

    public String generateToken(String username) {
        Date now = new Date();
        Date expiryDate = new Date(now.getTime() + expiration * 1000);

        return Jwts.builder()
                .setSubject(username)
                .setIssuedAt(now)
                .setExpiration(expiryDate)
                .signWith(SignatureAlgorithm.HS512, secretKey)
                .compact();
    }

    public String getUsernameFromToken(String token) {
        return Jwts.parser()
                .setSigningKey(secretKey)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }

    public boolean validateToken(String token) {
        try {
            Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
            return true;
        } catch (SignatureException ex) {
            // 令牌签名不正确
        } catch (MalformedJwtException ex) {
            // 不正确的令牌格式
        } catch (ExpiredJwtException ex) {
            // 令牌已过期
        } catch (UnsupportedJwtException ex) {
            // 不支持的令牌
        } catch (IllegalArgumentException ex) {
            // 令牌为空
        }
        return false;
    }
}
Java

JwtTokenProvider 类中包含了生成、解析和验证 JWT 令牌的方法。

4. 添加过滤器

最后,需要添加一个 JWT 认证的过滤器,用于在请求中获取和验证 JWT 令牌:

@Component
public class JwtTokenFilter extends OncePerRequestFilter {
    private JwtTokenProvider jwtTokenProvider;

    public JwtTokenFilter(JwtTokenProvider jwtTokenProvider) {
        this.jwtTokenProvider = jwtTokenProvider;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
        String token = jwtTokenProvider.resolveToken(request);

        if (token != null && jwtTokenProvider.validateToken(token)) {
            Authentication authentication = jwtTokenProvider.getAuthentication(token);
            SecurityContextHolder.getContext().setAuthentication(authentication);
        }

        filterChain.doFilter(request, response);
    }
}
Java

过滤器中首先从请求中获取 JWT 令牌,并通过 JwtTokenProvider 验证令牌的有效性。如果令牌有效,将在 Spring Security 的上下文中设置认证信息。

以上就是使用 Spring Security 进行 JWT 认证和授权的基本步骤。通过配置 Security、创建 JwtTokenProvider 以及添加过滤器,可以实现 JWT 令牌的生成、验证和应用。这样就能够在 Spring Security 中使用 JWT 进行认证和授权,提供安全的访问控制机制。