← Назад к вопросам

Как запретить обслуживание пользователей с емейлами в домена yahoo.com?

1.0 Junior🔥 81 комментариев
#Python Core#Безопасность

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Способы запретить обслуживание пользователей с yahoo.com

Это типичная задача при разработке сервиса — блокировка определённых доменов почты. Рассмотрим несколько подходов от простейшего к продвинутому.

1. Валидация при регистрации

Самый простой способ — проверка при создании пользователя:

from typing import Optional

BLOCKED_DOMAINS = {"yahoo.com", "yahoo.ru", "ymail.com"}

def validate_email(email: str) -> bool:
    """Проверяет, разрешен ли домен email"""
    if "@" not in email:
        return False
    
    domain = email.split("@")[1].lower()
    return domain not in BLOCKED_DOMAINS

# Использование
if not validate_email(user_email):
    raise ValueError("Email с домена yahoo.com не допускается")

2. Декоратор для функций

Если нужно защитить несколько функций, используй декоратор:

from functools import wraps

def require_allowed_email(func):
    """Декоратор: проверяет email пользователя перед выполнением"""
    @wraps(func)
    def wrapper(user_email: str, *args, **kwargs):
        if not validate_email(user_email):
            raise PermissionError(f"Email {user_email} заблокирован")
        return func(user_email, *args, **kwargs)
    return wrapper

@require_allowed_email
def process_user_data(user_email: str):
    print(f"Обработка {user_email}")

3. Middleware для веб-приложения

Для FastAPI добавь middleware на уровне приложения:

from fastapi import FastAPI, Request, status
from fastapi.responses import JSONResponse

app = FastAPI()

@app.middleware("http")
async def email_filter_middleware(request: Request, call_next):
    if request.method == "POST":
        try:
            body = await request.body()
            import json
            data = json.loads(body)
            email = data.get("email", "")
            if email and not validate_email(email):
                return JSONResponse(
                    status_code=status.HTTP_403_FORBIDDEN,
                    content={"detail": "Email домена yahoo.com запрещён"}
                )
        except:
            pass
    
    response = await call_next(request)
    return response

Рекомендация для production

Комбинируй подходы: клиентская валидация для UX, валидация API при регистрации, триггер БД как последняя линия защиты.

Как запретить обслуживание пользователей с емейлами в домена yahoo.com? | PrepBro