最新实战案例锦集:《Spring Boot3实战案例合集》持续更新,每天至少更新一篇文章,订阅后将赠送文章最后展示的所有MD文档(学习笔记)。
环境:Spring Boot3.2.5
1. 简介
安全性在REST API开发中起着至关重要的作用。一个不安全的REST API可能会直接暴露后端系统的敏感数据。因此,我们务必确保API的安全性。Spring Security提供了多种机制来保护我们的REST API,其中之一是API Key。API Key是客户端在调用API时提供的一种令牌(Token)。
REST API 是无状态的,因此不应该使用会话或 Cookies。相反,应该使用基本认证(Basic Authentication)、API Key、JWT(JSON Web Token)或基于 OAuth2 的令牌来确保其安全性,下面简单介绍这几种认证:
Basic Authentication
基本认证是一种简单的认证方案。客户端发送带有 Authorization
头的 HTTP 请求,该头包含单词 Basic
,后面跟着一个空格和一个 Base64 编码的字符串 username:password
。基本认证只有在与其他安全机制(如 HTTPS/SSL)结合使用时才被认为是安全的,也就是说你要使用Basic认证就必须使用HTTPS协议。
API Key
API Key是一种令牌,它在不引用实际用户的情况下识别 API 客户端。该令牌可以通过查询字符串或请求头发送。与基本认证类似,可以使用 SSL 来隐藏密钥。
OAuth2
OAuth2 是 REST API 安全的事实标准。它是一个开放的认证和授权标准,允许资源所有者通过访问令牌授予客户端对私有数据的访问权限。
在了解完以上3中认证方式后,接下来我们将详细介绍API Key的应用。
2. 实战案例
2.1 依赖管理
我们是基于Spring Security实现,所以需要引入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
在默认情况下,当我们引入了security后将会对整个应用的任何请求进行认证。接下来,我们将一步一步实现有针对性的对REST API进行认证。
2.2 自定义过滤器
我们将从请求中header中获取API key,然后根据我们的配置检查该key。我们要通过自定义过滤器来获取及校验key的合法性。如果验证通过则会设置Security 上下文信息表示认证通过,否则直接输出错误信息。
public class AuthenticationFilter extends GenericFilterBean {
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
try {
Authentication authentication = AuthenticationService.getAuthentication((HttpServletRequest) request);
AuthenticationCheck.success(authentication) ;
} catch (Exception exp) {
// 认证未通过处理
AuthenticationCheck.failure(response) ;
return ;
}
filterChain.doFilter(request, response) ;
}
}
在该过滤器中,我们通过自定义的AuthenticationService对当前的请求进行验证(下面会介绍该类),如果发生异常则在catch中直接向客户端输出错误信息,不再进行向下执行。