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.