使用Spring Boot和Spring Security构建安全的RESTful API
引言
在现代Web应用中,安全性是至关重要的。Spring Boot和Spring Security为开发者提供了强大的工具来保护RESTful API。本文将介绍如何结合JWT(JSON Web Token)实现身份验证与授权,并提供一个完整的示例项目。
技术栈
- 核心框架: Spring Boot, Spring Security
- 身份验证: JWT
- 数据库: H2 (用于演示)
- 构建工具: Maven
项目初始化
首先,使用Spring Initializr创建一个新的Spring Boot项目,添加以下依赖:
- Spring Web
- Spring Security
- H2 Database
- Lombok (简化代码)
配置Spring Security
-
创建安全配置类
创建一个继承自
WebSecurityConfigurerAdapter的配置类,并覆盖configure方法以定义安全规则。@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable() .authorizeRequests() .antMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); } } -
配置JWT
创建一个JWT工具类,用于生成和验证Token。
@Component public class JwtTokenProvider { private String jwtSecret = "your-secret-key"; private int jwtExpirationInMs = 3600000; // 1 hour public String generateToken(Authentication authentication) { UserPrincipal userPrincipal = (UserPrincipal) authentication.getPrincipal(); Date now = new Date(); Date expiryDate = new Date(now.getTime() + jwtExpirationInMs); return Jwts.builder() .setSubject(Long.toString(userPrincipal.getId())) .setIssuedAt(now) .setExpiration(expiryDate) .signWith(SignatureAlgorithm.HS512, jwtSecret) .compact(); } public Long getUserIdFromJWT(String token) { Claims claims = Jwts.parser() .setSigningKey(jwtSecret) .parseClaimsJws(token) .getBody(); return Long.parseLong(claims.getSubject()); } public boolean validateToken(String authToken) { try { Jwts.parser().setSigningKey(jwtSecret).parseClaimsJws(authToken); return true; } catch (Exception ex) { return false; } } }
实现用户认证
-
创建用户模型
定义一个用户实体类,并使用JPA注解映射到数据库。
@Entity @Data public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String password; } -
用户注册与登录
创建一个控制器处理用户注册和登录请求。
@RestController @RequestMapping("/api/auth") public class AuthController { @Autowired private AuthenticationManager authenticationManager; @Autowired private JwtTokenProvider tokenProvider; @PostMapping("/login") public ResponseEntity<?> authenticateUser(@RequestBody LoginRequest loginRequest) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( loginRequest.getUsername(), loginRequest.getPassword() ) ); String jwt = tokenProvider.generateToken(authentication); return ResponseEntity.ok(new JwtAuthenticationResponse(jwt)); } }
测试API
使用Postman或类似的工具测试以下端点:
POST /api/auth/login- 用户登录GET /api/users- 获取用户列表(需要Token)
总结
通过本文,我们学习了如何使用Spring Boot和Spring Security结合JWT实现安全的RESTful API。这种方案不仅易于实现,还能有效保护API免受未授权访问。
完整代码
完整的项目代码可以在GitHub仓库中找到。
5万+

被折叠的 条评论
为什么被折叠?



