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>

2. 配置Security

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

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

配置中可以设置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;
    }
}

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);
    }
}

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

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