Сначала опишите роли и права

Не начинайте с формы регистрации. Составьте матрицу: кто может видеть профиль, заказы, документы, чужие данные, статусы и административные действия.

Минимальные сущности кабинета

Сущность
ранит
usersидентификатор и auth-данные
profilesимя, контакты, реквизиты
roles/permissionsдоступ
sessionsактивные сессии/устройства
orders/operationsистория действий
password_resetsодноразовые токены
audit_logважные изменения
external_linksсвязи с CRM/ERP

Пароли не хранят в открытом виде

Используйте password hashing API платформы/фреймворка, ограничивайте попытки входа, делайте одноразовые токены восстановления с истечением срока и инвалидируйте их после использования.

PHP: базовое хеширование пароля

PHP
$hash = password_hash($password, PASSWORD_DEFAULT);

if (password_verify($passwordFromForm, $hashFromDb)) {
    // Успешная проверка.
}

// Никогда не храните исходный пароль
// и не отправляйте его в лог.

История операций должна иметь источник истины

Если заказы живут в CRM/ERP, решите: кабинет читает их онлайн через API или получает синхронизированную копию. Нельзя показывать пользователю данные из двух несогласованных источников.

Сессии и безопасность

  • HTTPS обязателен;
  • Secure/HttpOnly cookies;
  • CSRF-защита для изменяющих запросов;
  • проверка прав на сервере, а не только скрытие кнопок;
  • аудит смены email/телефона/реквизитов;
  • 2FA для чувствительных кабинетов, если риск оправдан.

Что проверить перед запуском

СценарийПроверка
Регистрацияduplicate email/phone
Loginrate limit и session
Восстановлениетокен одноразовый и истекает
Роли
одит ACL
Чужой объектIDOR запрещён сервером
Logoutsession инвалидирована
Изменение профиляaudit log
CRM/ERP недоступнапонятный fallback/status

Связанные материалы