跳转至

安全配置

安全配置用于管理 FastAPI-Easy 的所有安全相关设置。本文档介绍如何配置安全选项。


基础配置

from fastapi_easy.security import SecurityConfig

config = SecurityConfig(
    # 认证配置
    enable_auth=True,
    auth_scheme="bearer",

    # 权限配置
    enable_permissions=True,
    default_permission="read",

    # 速率限制
    enable_rate_limit=True,
    rate_limit_requests=100,
    rate_limit_period=3600,

    # 密码配置
    password_min_length=8,
    password_require_uppercase=True,
    password_require_numbers=True,
    password_require_special=True,
)

认证配置

config = SecurityConfig(
    enable_auth=True,
    auth_scheme="bearer",
    jwt_secret="your-secret-key",
    jwt_algorithm="HS256",
    jwt_expiration=3600,
)

权限配置

config = SecurityConfig(
    enable_permissions=True,
    default_permission="read",
    permission_loader=DatabasePermissionLoader(),
    cache_permissions=True,
    cache_ttl=3600,
)

速率限制配置

config = SecurityConfig(
    enable_rate_limit=True,
    rate_limit_requests=100,
    rate_limit_period=3600,  # 1 小时
    rate_limit_storage="memory",  # 或 "redis"
)

密码策略

config = SecurityConfig(
    password_min_length=12,
    password_require_uppercase=True,
    password_require_lowercase=True,
    password_require_numbers=True,
    password_require_special=True,
    password_special_chars="!@#$%^&*",
)

应用配置

from fastapi import FastAPI
from fastapi_easy import CRUDRouter

app = FastAPI()

router = CRUDRouter(
    schema=Item,
    adapter=adapter,
    security_config=config
)

app.include_router(router)

最佳实践

1. 使用环境变量

import os
from fastapi_easy.security import SecurityConfig

config = SecurityConfig(
    jwt_secret=os.getenv("JWT_SECRET"),
    jwt_algorithm=os.getenv("JWT_ALGORITHM", "HS256"),
    jwt_expiration=int(os.getenv("JWT_EXPIRATION", "3600")),
)

2. 分环境配置

from enum import Enum

class Environment(str, Enum):
    DEV = "dev"
    PROD = "prod"

def get_security_config(env: Environment) -> SecurityConfig:
    if env == Environment.PROD:
        return SecurityConfig(
            enable_auth=True,
            enable_permissions=True,
            enable_rate_limit=True,
            password_min_length=12,
        )
    else:
        return SecurityConfig(
            enable_auth=False,
            password_min_length=6,
        )

3. 定期更新密钥

# 定期轮换 JWT 密钥
import asyncio

async def rotate_jwt_secret():
    while True:
        await asyncio.sleep(86400)  # 每天轮换一次
        new_secret = generate_new_secret()
        config.jwt_secret = new_secret

常见问题

Q: 如何更改 JWT 密钥?

A: 更新 config.jwt_secret 并重启应用。

Q: 如何禁用某个安全功能?

A: 在 SecurityConfig 中设置相应的 enable_* 为 False。

Q: 如何自定义密码策略?

A: 继承 SecurityConfig 并覆盖 validate_password 方法。