spring security 是保护 rest 接口最主流方案,通过无状态认证(如 api key、jwt、oauth2.0)、禁用 session/csrf、自定义 jwt 过滤器及明确区分认证授权来实现安全防护。

Spring Security 是保护 REST 接口最主流、最成熟的选择,核心在于它能适配无状态(stateless)特性,不依赖 Session 或 Cookie,而是通过请求头携带凭证完成认证与授权。关键不是“加个依赖就安全”,而是按需选型、精准配置、隔离敏感路径。
选择适合的认证方式
REST 接口必须避免会话机制,以下三种是生产常用方案:
-
API Key:轻量级,适合内部系统或第三方调用方固定、无需用户粒度控制的场景。密钥通常放在
Header: X-API-Key或查询参数中,后端校验白名单或数据库记录。 -
JWT(基于 Token):主流选择。登录成功后返回含用户身份、角色、过期时间的签名令牌;后续请求在
Authorization: Bearer <token></token>中携带。服务端验证签名和有效期,无需查库即可鉴权。 -
OAuth2.0(如 Resource Owner Password Flow 或 Client Credentials):适合多系统协作、需委托授权的场景。由独立授权服务器签发访问令牌,Spring Security 提供完整支持(
spring-boot-starter-oauth2-resource-server)。
配置无状态安全链(Spring Security 6+)
必须显式禁用 Session 和 CSRF,并启用 stateless 模式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 关闭 CSRF:REST 接口不涉及表单提交,
.csrf(csrf -> csrf.disable())是必需操作。 - 禁用 Session:调用
.sessionManagement(s -> s.sessionCreationPolicy(SessionCreationPolicy.STATELESS)),防止 Spring 创建 HttpSession。 - 放行公开路径:如
/api/auth/login、/api/public/**必须.permitAll(),否则无法登录。 - 拦截受保护资源:用
.requestMatchers("/api/private/**").authenticated()或更细粒度的.hasRole("ADMIN")控制访问。
自定义认证过滤器(以 JWT 为例)
Spring Security 不内置 JWT 解析逻辑,需手动注入过滤器:
- 编写
JwtAuthenticationFilter:继承OncePerRequestFilter,从请求头提取 token,解析并校验签名、过期、内容(如 subject、roles)。 - 构建
UsernamePasswordAuthenticationToken并设入SecurityContextHolder,完成认证上下文初始化。 - 在
SecurityFilterChain配置中,用.addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class)插入到默认认证流程之前。
区分认证与授权,合理使用角色/权限
认证(Authentication)只回答“你是谁”,授权(Authorization)才决定“你能做什么”:
- 登录时把用户角色(如
ROLE_ADMIN、ROLE_USER)写入 JWT 的roles声明,或存在数据库中供过滤器加载。 - 接口层用
@PreAuthorize("hasRole('ADMIN')")或@PostAuthorize("returnObject.owner == authentication.name")实现方法级控制。 - 避免仅靠前端隐藏按钮来控制权限——后端必须对每个敏感接口做明确授权检查。










