FastAPI 如何仅允许特定IP访问API端点
在本文中,我们将介绍如何在FastAPI中配置API端点,以便只允许特定IP地址的访问。这种需求在一些场景中非常常见,比如保护敏感数据、限制访问权限等。
阅读更多:FastAPI 教程
使用装饰器限制IP访问
FastAPI提供了一种简单而有效的方式来限制API端点的访问,即通过自定义装饰器实现。我们可以定义一个装饰器函数,在请求到达API端点之前进行IP地址的检查,只允许特定的IP进行访问。
下面是一个示例代码:
from fastapi import Depends, FastAPI, HTTPException, Request
from ipaddress import IPv4Address, IPv6Address, ip_address
app = FastAPI()
# 允许访问的IP列表
ALLOWED_IPS = ['192.168.0.1', '10.0.0.1', '172.16.0.1']
def check_ip(request: Request):
client_ip = ip_address(request.client.host)
if client_ip not in [ip_address(ip) for ip in ALLOWED_IPS]:
raise HTTPException(status_code=403, detail="IP地址未授权")
return True
@app.get("/protected")
def protected_endpoint(ip_check: bool = Depends(check_ip)):
return {"message": "只有授权IP才能访问的API端点"}
在上面的代码示例中,我们定义了一个名为check_ip
的函数,用于检查请求的IP地址是否在允许访问的IP列表中。如果IP地址未被授权,则抛出HTTP 403异常。然后,我们在protected_endpoint
函数中使用了该装饰器函数来进行IP地址的检查。只有通过IP地址检查的请求才能访问该API端点。
使用中间件限制IP访问
除了使用装饰器函数之外,我们还可以使用FastAPI的中间件来限制API端点的访问。中间件是在请求到达API端点之前进行操作的函数,可以用于鉴权、权限控制等需求。
下面是一个使用中间件限制IP访问的示例代码:
from fastapi import FastAPI, HTTPException, Request
from ipaddress import IPv4Address, IPv6Address, ip_address
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
app = FastAPI()
# 允许访问的IP列表
ALLOWED_IPS = ['192.168.0.1', '10.0.0.1', '172.16.0.1']
class IPFilterMiddleware(BaseHTTPMiddleware):
async def dispatch(
self, request: Request, call_next: RequestResponseEndpoint
):
client_ip = ip_address(request.client.host)
if client_ip not in [ip_address(ip) for ip in ALLOWED_IPS]:
raise HTTPException(status_code=403, detail="IP地址未授权")
response = await call_next(request)
return response
@app.middleware("http")
async def add_ip_filter_middleware(request: Request, call_next):
response = await IPFilterMiddleware().dispatch(request, call_next)
return response
@app.get("/protected")
def protected_endpoint():
return {"message": "只有授权IP才能访问的API端点"}
在上面的代码示例中,我们定义了IPFilterMiddleware
类作为中间件函数,用于检查请求的IP地址是否在允许访问的IP列表中。如果IP地址未被授权,则抛出HTTP 403异常。然后,我们使用app.middleware("http")
装饰器将中间件函数注册到FastAPI应用程序中,以确保在请求到达API端点之前进行IP地址的检查。
总结
本文介绍了如何通过使用装饰器函数和中间件来限制FastAPI中API端点的访问只允许特定IP地址。通过使用这些方法,我们可以轻松地实现IP地址的过滤和访问控制,保护API不受未授权访问的风险。通过这种方式,我们可以更好地保护敏感数据和限制访问权限。
以上是关于FastAPI如何仅允许特定IP访问API端点的介绍,希望对你有所帮助!