使用Spring Boot和Spring Security联合JWT实现安全的RESTful API

[复制链接]
发表于 2025-5-25 06:01:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
使用Spring Boot和Spring Security联合JWT实现安全的RESTful API

引言

在现代Web应用中,安全性是至关紧张的。Spring Boot和Spring Security提供了强大的工具来保护我们的应用步伐,而JWT(JSON Web Token)则是一种轻量级的认证和授权机制。本文将具体介绍如何联合这三者来实现一个安全的RESTful API
技术栈



  • 核心框架: Spring Boot, Spring Security
  • 认证机制: JWT
  • 数据库: 可选(本文使用H2内存数据库
  • 构建工具: Maven
实现步骤

1. 创建Spring Boot项目

起首,使用Spring Initializr创建一个新的Spring Boot项目,添加以下依靠:


  • Spring Web
  • Spring Security
  • H2 Database(可选)
  • JWT库(如jjwt)
2. 设置Spring Security

在application.properties或application.yml中设置Spring Security的基本设置,比方:
  1. spring:
  2.   security:
  3.     user:
  4.       name: admin
  5.       password: password
复制代码
3. 实现JWT认证

天生JWT Token

创建一个服务类来天生和验证JWT Token。以下是一个简单的实现:
  1. @Service
  2. public class JwtTokenProvider {
  3.     private String jwtSecret = "your-secret-key";
  4.     private long jwtExpirationInMs = 3600000; // 1 hour
  5.     public String generateToken(Authentication authentication) {
  6.         UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal();
  7.         Date now = new Date();
  8.         Date expiryDate = new Date(now.getTime() + jwtExpirationInMs);
  9.         return Jwts.builder()
  10.                 .setSubject(Long.toString(userPrincipal.getId()))
  11.                 .setIssuedAt(new Date())
  12.                 .setExpiration(expiryDate)
  13.                 .signWith(SignatureAlgorithm.HS512, jwtSecret)
  14.                 .compact();
  15.     }
  16.     public Long getUserIdFromJWT(String token) {
  17.         Claims claims = Jwts.parser()
  18.                 .setSigningKey(jwtSecret)
  19.                 .parseClaimsJws(token)
  20.                 .getBody();
  21.         return Long.parseLong(claims.getSubject());
  22.     }
  23.     public boolean validateToken(String authToken) {
  24.         try {
  25.             Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken);
  26.             return true;
  27.         } catch (Exception ex) {
  28.             // Handle exceptions
  29.         }
  30.         return false;
  31.     }
  32. }
复制代码
设置JWT过滤器

创建一个过滤器来拦截哀求并验证JWT Token:
  1. public class JwtAuthenticationFilter extends OncePerRequestFilter {
  2.     @Override
  3.     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
  4.         try {
  5.             String jwt = getJwtFromRequest(request);
  6.             if (StringUtils.hasText(jwt) && tokenProvider.validateToken(jwt)) {
  7.                 Long userId = tokenProvider.getUserIdFromJWT(jwt);
  8.                 // Load user details and set authentication
  9.             }
  10.         } catch (Exception ex) {
  11.             // Handle exceptions
  12.         }
  13.         filterChain.doFilter(request, response);
  14.     }
  15.     private String getJwtFromRequest(HttpServletRequest request) {
  16.         String bearerToken = request.getHeader("Authorization");
  17.         if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
  18.             return bearerToken.substring(7);
  19.         }
  20.         return null;
  21.     }
  22. }
复制代码
4. 保护API端点

使用@PreAuthorize注解来保护API端点:
  1. @RestController
  2. @RequestMapping("/api")
  3. public class ApiController {
  4.     @GetMapping("/public")
  5.     public String publicEndpoint() {
  6.         return "This is a public endpoint.";
  7.     }
  8.     @GetMapping("/private")
  9.     @PreAuthorize("hasRole('USER')")
  10.     public String privateEndpoint() {
  11.         return "This is a private endpoint.";
  12.     }
  13. }
复制代码
5. 测试API

使用Postman或类似的工具测试API的安全性:

  • 获取JWT Token。
  • 使用Token访问受保护的端点。
总结

通过本文,我们学习了如何使用Spring Boot和Spring Security联合JWT来实现安全的RESTful API。这种方法不仅简单易用,而且具有高度的机动性和扩展性。
扩展阅读


常见问题


  • 如何革新Token?

    • 可以实现一个革新Token的机制,通常是通过一个单独的端点来天生新的Token。

  • 如何存储用户信息?

  • 如何扩展安全性?

    • 可以联合OAuth2或其他安全框架来增强安全性。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告
回复

使用道具 举报

快速回复 返回顶部 返回列表