Skip to content

Пользователи

Этот раздел про пользователей публичной части сайта — посетителей, которые регистрируются и логинятся в личный кабинет, оставляют заказы и т.п. Управление — раздел Пользователи (/cms/users) в админке.

Не путать с менеджерами

Менеджер (Manager) — сотрудник с доступом в админку. Управление — раздел Менеджеры (/cms/managers). См. Первый вход в админку.

Пользователь (User) — посетитель сайта. Управление — раздел Пользователи (/cms/users). Эта страница про него.

Разные таблицы (cms_users vs таблица менеджеров), разные guard'ы, разные API-эндпоинты.

Модель User

Класс: Templite\Cms\Models\User. Таблица: cms_users.

КолонкаНазначение
nameИмя пользователя
emailEmail (используется как login)
passwordХэш пароля (Argon2/Bcrypt, автокаст hashed)
user_type_idFK на cms_user_types
avatar_idFK на files
dataJSON — значения кастомных полей профиля
settingsJSON — настройки пользователя (пользовательский UI и т.п.)
is_activeBoolean — заблокирован/активен
email_verified_atTimestamp подтверждения email

Дополнительно через trait/contracts:

  • MustVerifyEmail — поддержка подтверждения email.
  • HasApiTokens (Sanctum) — Bearer-токены для API.

Aксессор avatar_url

php
$user->avatar_url;

Возвращает:

  • /api/cms/media/serve/<id> — для аватара на локальном disk'е (проксируется через CMS, что позволяет проверять права).
  • Прямой URL — если файл на S3 / CDN.
  • null — если аватар не задан.

Кастомные поля профиля

Значения кастомных полей хранятся в JSON-колонке cms_users.data. Доступ:

php
$user->getFieldValue('bio', 'default value');
$user->setFieldValue('phone', '+7 999 000-00-00');
$user->save();

Структура data определяется через UserField (см. ниже).


Типы пользователей (UserType)

Таблица cms_user_types. Каждый тип определяет сегмент аудитории с собственным guard'ом и набором разрешений.

КолонкаНазначение
slugИдентификатор типа (customer, partner, member)
nameОтображаемое название
guardИмя Laravel auth-guard'а — отделяет аутентификацию между типами
moduleКакой модуль владеет этим типом (для шопа, CRM и т.п.)
permissionsJSON-массив разрешений
settingsJSON: registration_enabled, email_verification_required и др.
is_activeBoolean

Multi-guard аутентификация

Templite поддерживает несколько guard'ов для разных сегментов пользователей. Например:

  • Тип customer (guard customer) — обычные клиенты сайта.
  • Тип partner (guard partner) — партнёрский личный кабинет.

Один и тот же email может быть зарегистрирован в обоих сегментах независимо — это реализуется через разные guard'ы.

Регистрация

Доступность регистрации настраивается per-type через settings:

php
$type->isRegistrationEnabled();        // settings.registration_enabled
$type->isEmailVerificationRequired();  // settings.email_verification_required

Если регистрация выключена для типа — публичный endpoint регистрации возвращает 403.


Кастомные поля профиля (UserField)

Таблица cms_user_fields. Для каждого типа можно описать произвольные поля профиля.

КолонкаНазначение
user_type_idFK на тип пользователя
keyИдентификатор поля (snake_case)
nameОтображаемое название
typeТип поля (см. ниже)
default_valueЗначение по умолчанию
dataJSON-конфиг тип-специфичных опций
hintПодсказка для пользователя
tabСлаг таба в UI профиля
parent_idВложенность (для repeater'ов)
orderПорядок

Допустимые типы полей

text, textfield, number, img, file, editor, tiptap, html,
select, checkbox, radio, link, date, datetime,
array, color, page, user

Это те же 18 типов, что у блоков, минус шопные (category, product, product_option). Подробнее — Поля.

Зарезервированные ключи

Имена полей не должны конфликтовать с колонками cms_users:

id, name, email, password, avatar, avatar_id,
type, user_type_id, settings, is_active, data

Защита — UserField::RESERVED_KEYS.

Хранение значений

Значения кастомных полей хранятся в одной JSON-колонке cms_users.data — не в отдельной таблице values. Это отличает поведение от глобальных настроек и блоков:

СущностьГде хранятся значения полей
Блокиpage_blocks.data (JSON на странице)
Глобальные настройкиglobal_field_values (отдельная таблица)
Атрибуты страницpage_attribute_values (отдельная таблица)
Профиль пользователяcms_users.data (JSON в самой записи пользователя)

Доступ — через $user->getFieldValue($key) / $user->setFieldValue($key, $value).


Аутентификация

Endpoint логина

POST /api/cms/user-auth/{guard}/login — отдельный endpoint для каждого guard'а.

Тело запроса:

json
{
    "email": "user@example.com",
    "password": "secret"
}

Ответ (успех) — токен Sanctum:

json
{
    "token": "1|abcdef...",
    "user": { ... }
}

Использование токена

http
Authorization: Bearer 1|abcdef...

Текущий пользователь в Blade

В Blade-шаблонах публичной части можно использовать стандартные Laravel-фасады для guard'ов:

blade
@auth('customer')
    Привет, {{ auth('customer')->user()->name }}!
@endauth

@guest('customer')
    <a href="/login">Войти</a>
@endguest

В контроллере:

php
$user = auth($guard)->user();

Имя guard'а конкретного пользователя — $user->getGuardName().

2FA для frontend-пользователей

В отличие от менеджеров админки, для публичных пользователей 2FA из коробки не реализована. Если нужна — реализовать вручную через User->settings и middleware.


Программный доступ

Создание пользователя

php
use Templite\Cms\Models\User;
use Illuminate\Support\Facades\Hash;

$user = User::create([
    'user_type_id' => $customerTypeId,
    'name' => 'Иван Иванов',
    'email' => 'ivan@example.com',
    'password' => 'secret123', // автокаст в hashed
    'is_active' => true,
    'data' => [
        'phone' => '+7 999 000-00-00',
        'city' => 'spb',
    ],
]);

Так как password каст в hashed — Eloquent автоматически прогоняет значение через Hash::make().

Запрос по типу

php
User::whereHas('userType', fn ($q) => $q->where('slug', 'customer'))
    ->where('is_active', true)
    ->get();

Управление через UI

В админке (/cms/users):

  • Список пользователей с фильтрами по типу и активности.
  • Создание/редактирование с заполнением кастомных полей профиля.
  • Блокировка (is_active = false).

В админке (/cms/users → раздел «Типы»):

  • Управление UserType — slug, guard, permissions, настройки регистрации.
  • Настройка кастомных полей (UserField) для каждого типа.

Подводные камни

Подводные камни

  • Это не менеджеры админки. Менеджеры — отдельная модель в другой таблице. Сброс пароля менеджера — cms:reset-password <login>, для frontend-пользователей такой команды нет.
  • Таблица cms_users, не users. Если в проекте уже есть стандартная Laravel-таблица users — она остаётся независимой. CMS не использует её для frontend-пользователей.
  • Multi-guard. Один email может быть зарегистрирован в разных guard'ах одновременно. Поэтому unique-индекс на email — обычно в рамках guard'а, не глобальный.
  • Зарезервированные ключи кастомных полей нельзя использовать. Они перекрывают колонки модели.
  • Значения кастомных полей хранятся в JSON-колонке data, не в отдельной таблице. Это упрощает CRUD, но делает запросы по значениям полей менее эффективными — для частых запросов добавляйте отдельные индексированные колонки.
  • avatar_url для локальных файлов проксируется через /api/cms/media/serve/<id>, не отдаёт прямой Storage-URL. Это позволяет проверять права (приватные аватары и т.п.). Для S3/CDN аватаров — прямой URL.
  • 2FA для frontend-пользователей не реализована в CMS. Только для менеджеров админки.
  • При смене APP_KEY Sanctum-токены становятся недействительными (как и сессии). Все пользователи и менеджеры будут разлогинены.

Связанные разделы

Распространяется под лицензией MIT.