FastAPI 如何仅允许特定IP访问API端点

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端点的介绍,希望对你有所帮助!

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程