使用Spring Security保护Rest API安全 - OctoPerf
大多数在线的 Spring 教程都会教您如何使用 Spring 来确保 Rest API 的安全性,但这些示例往往与实际应用场景相去甚远。许多教程缺乏真实的用例,这使得开发者在实际项目中难以直接应用这些知识。
本教程旨在帮助您保护真实世界的应用程序,而不仅仅是另一个 "Hello World" 示例。在本文中,您将学习以下内容:
- 如何使用 Spring Security 来保护 Spring MVC 的 Rest API;
- 使用 Java 代码配置 Spring Security(无需复杂的 XML 配置);
- 将身份验证逻辑委托给自定义的
UserAuthenticationService。
经过数周的探索和优化,我们总结出了一套简单易用的 Spring Security 配置方案。让我们开始吧!
架构概览
以下是 Spring Security 设置的基本工作原理:
- 用户通过包含用户名和密码的 POST 请求进行登录;
- 服务器返回一个临时或永久的认证令牌;
- 用户在每个 HTTP 请求中通过
Authorization: Bearer token头部发送令牌。
当用户注销时,服务器端的令牌会被清除。接下来,我们将探讨两种身份验证的实现方式:
- 简单示例:基于用户 UUID 的身份验证;
- JWT 示例:基于 JWT 令牌的身份验证。
简单示例架构

上图展示了“简单示例”模块与其他模块的交互方式。
JWT 示例架构

与“简单示例”模块相比,JWT 示例增加了对“用户身份验证令牌”和“令牌 JWT”模块的依赖。
Maven 配置
我们首先设置根 Maven 模块的配置,以便为项目提供基础支持。
常见配置
用户管理
在本节中,我们将介绍用户登录和注销功能的实现。
用户实体
用户实体模块包含一个表示单个用户的 User 类。为了与 Spring Security API 兼容,User 类需要实现 UserDetails 接口,从而使自定义用户实体能够与 Spring Security 无缝集成。
用户 CRUD API
用户 API 负责用户的存储和管理。在示例中,我们使用了一个内存存储实现 InMemoryUsers:
Map users = new HashMap();
这是一个简单的演示实现。在实际应用中,用户数据应存储在数据库中,并通过 UserCrudService 进行管理。
用户身份验证 API
user-auth-api 模块包含 UserAuthenticationService,用于处理用户登录、注销以及认证令牌的生成和验证。
Spring Security 配置
Spring Security 的核心配置存储在 security-config 模块中。
重定向策略
在身份验证失败时服务器不应重定向到错误页面,而是直接返回 HTTP 401(未经授权)。以下是 NoRedirectStrategy 的实现:
public class NoRedirectStrategy implements RedirectStrategy {
@Override
public void sendRedirect(HttpServletRequest request, HttpServletResponse response, String url) {
// 不执行任何重定向操作
}
}
令牌身份验证提供程序
TokenAuthenticationProvider 负责通过令牌查找用户,并将身份验证逻辑委托给 UserAuthenticationService。
令牌认证过滤器
TokenAuthenticationFilter 从请求头中提取认证令牌,并将其交给 AuthenticationManager 进行验证。该过滤器仅对指定的 URL 启用。
安全配置
以下是 Spring Security 配置的关键点:
- 以
/public/**开头的 URL 不受保护; TokenAuthenticationFilter在过滤器链中优先注册;- 禁用默认的登录方法(如
formLogin和httpBasic),以便使用自定义的身份验证系统; - 禁用 Spring Boot 的自动过滤器注册。
通过不到 100 行的 Java 配置代码,我们完成了所有必要的安全设置。
Spring MVC 控制器
公共用户控制器
PublicUsersController 提供以下两个端点:
register:注册新用户并返回认证令牌;login:登录现有用户并返回认证令牌。
安全用户控制器
SecuredUsersController 仅允许已登录的用户执行以下操作:
- 获取当前用户信息;
- 注销用户。
应用程序引导
Application 类位于 bootstrap 模块中,用于通过 Spring Boot 启动应用程序。默认情况下,服务器运行在端口 8080。您可以通过修改 application.yml 文件更改端口,例如设置为 8081。
简单示例
用户身份验证 UUID
在简单示例中,UserAuthenticationService 使用随机生成的 UUID 作为认证令牌。这种实现非常基础,您可以根据需求替换为更复杂的逻辑。
配置
以下是简单示例的配置:

运行应用程序后,您可以通过 curl 测试以下功能:
- 注册新用户;
- 使用用户名和密码登录;
- 使用返回的 UUID 令牌访问受保护的资源;
- 注销用户并验证令牌失效。
JWT 示例
JWT(JSON Web Token)是一种轻量级的身份验证方式。服务器生成并签名令牌,客户端在每次请求中通过 Authorization: Bearer token 头部发送令牌。
令牌 API
token-api 模块定义了 TokenService 接口,用于生成和验证 JWT 令牌。
JWT 令牌实现
JWTTokenService 使用 jjwt 库实现令牌的生成和验证:
String token = Jwts.builder()
.setSubject(username)
.signWith(SignatureAlgorithm.HS512, secretKey)
.compact();
配置
JWT 示例的配置与简单示例类似,但使用了 JWT 令牌进行身份验证。运行应用程序后,您可以通过以下步骤测试功能:
- 注册新用户;
- 使用用户名和密码登录,获取 JWT 令牌;
- 使用 JWT 令牌访问受保护的资源;
- 注销用户并验证令牌失效。
总结
通过本教程,您可以快速构建一个安全的 Rest API。Spring Security 的灵活性使得您可以轻松替换或扩展身份验证逻辑,从而满足不同的业务需求。
希望本教程能够帮助您节省时间,快速掌握 Spring Security 的核心功能!
原文链接: https://octoperf.com/blog/2018/03/08/securing-rest-api-spring-security/
最新文章
- 介绍全新的Rust REST API客户端库
- DeepSeek R1 × 飞书多维表格赋能教育领域
- 深入解析什么是API安全
- 使用 C++ 和 Win32 API 创建 GUI 窗口应用程序:从零构建 Windows 桌面界面
- 一个平台对接所有API:企业级API集成解决方案
- 台湾可以用支付宝吗?:支付与收款指南
- 深入解读 API Gateway:设计原则、实践与最佳架构
- 什么是 LangSmith
- 为API网关构建ChatGPT自定义插件 – API7.ai
- 更快的API,更高效的开发者:API Gateway自定义授权器
- 如何使用 node.js 和 express 创建 rest api
- 2025年暑假大学生AI副业+联盟营销指南:自动化文章与链接实现月入过万