Куда поместить логику проверки длины пароля: в домен, прикладную логику или презентационный слой?
Что проверяют
Понимаете ли вы, чем бизнес-правило отличается от проверки ввода и что одно правило может проверяться в нескольких слоях, но жить только в одном. Следом спрашивают, что будет, если к API обратятся в обход формы.
Как отвечать
Короткий ответ: правило «пароль не короче N символов» относится к домену, а остальные слои либо дублируют его ради удобства, либо переводят ошибку в понятный ответ.
- домен: объект-значение
Passwordили доменный сервис проверяет длину при создании и бросает доменное исключение, напримерWeakPasswordError. Это единственное место, где живёт правило, и оно тестируется обычнымpytestбез базы и фреймворка; - прикладной слой: сценарий
RegisterUserсоздаётPassword, ловит доменную ошибку и решает, что делать дальше. Сам длину он не считает; - презентационный слой: схема Pydantic в FastAPI (
Field(min_length=...)) или форма Django проверяет длину заранее, чтобы пользователь сразу увидел подсказку. Это UX, а не защита: запрос можно отправить напрямую черезcurl; - хэширование: пароль превращается в хэш (
argon2,bcrypt) после доменной проверки, в инфраструктурном слое.
Минимальную длину лучше держать в конфигурации или одной константе, чтобы схема Pydantic и домен читали одно значение.
Стоит упомянуть, как это устроено в Django: AUTH_PASSWORD_VALIDATORS с MinimumLengthValidator (по умолчанию 8 символов) вызываются из форм и через validate_password, а не из модели. Это прагматичный компромисс фреймворка: политику паролей там считают настройкой безопасности, а не частью модели пользователя. Если спросят, допустимо ли так, ответ «да, если правило одно и вызывается из всех входных точек».
Где спотыкаются
Проверяют длину только во фронтенде или только в схеме запроса. Второй клиент, скрипт импорта или админка создают пользователя с паролем из одного символа.
Вешают проверку на модель ORM или на ограничение в базе. Там уже лежит хэш фиксированной длины, и проверять его длину бессмысленно.
Копируют число 8 по трём слоям. Политику меняют, форма начинает пропускать пароль, который домен отклоняет, а пользователь видит невнятную ошибку 500.