9.9 KiB
Авторизация (Auth)
App\Common\Auth обслуживает два связанных контекста одной личности:
системную роль панели и публичный профиль сайта. Методы без префикса относятся
к доступу в Adminx, методы с префиксом public* — к профилю, контенту, корзине
и заказам. Связанный сотрудник входит в оба контура одной сессией; доступ
публичного пользователя в Adminx настраивается в его редакторе.
use App\Common\Auth;
Администратор (панель /adminx)
| Метод | Возврат |
|---|---|
check() |
Авторизован ли админ (bool). |
user() |
Массив данных пользователя (или пусто). |
id() |
ID пользователя. |
role() |
Код роли. |
is($role) |
Совпадает ли роль. |
systemUser() |
Полный «системный» пользователь. |
systemUserCan($permission) |
Есть ли у него право. |
attempt($identifier, $password, array $options = []) |
Попытка входа. |
login(array $user, array $options = []) |
Залогинить (после проверки). |
logout(array $options = []) |
Выйти. |
ensureBrowserToken(array $options = []) |
Персистентный токен «запомнить меня». |
if (!Auth::check()) { Response::unauthorized(); return ''; }
$userId = (int) Auth::id();
$name = Auth::user()['name'] ?? '';
if (Auth::is('admin')) { /* только для роли admin */ }
Вход:
if (Auth::attempt($login, $password, array('remember' => true))) {
// успех — сессия установлена
} else {
// неверные данные / троттлинг (см. LoginThrottle)
}
Проверку конкретных прав делайте через
Permission::check(), а не только по роли — это гибче и учитывает права модулей.
Посетитель сайта (публичный контекст)
Стандартные публичные группы чистой установки: 1 — администраторы, 2 —
гости, 3 — модераторы, 4 — пользователи сайта. Публичная
группа определяет доступ к содержимому сайта; права Adminx определяет связанная
системная роль.
| Метод | Возврат |
|---|---|
publicCheck() |
Авторизован ли посетитель. |
publicUser() |
Данные посетителя. |
publicAttempt($identifier, $password, $remember = false) |
Вход на сайте. |
publicLogout() |
Выход. |
publicRegistrationEnabled() |
Разрешена ли регистрация. |
publicBootstrap() |
Поднять публичный контекст авторизации. |
if (Auth::publicCheck()) {
$customer = Auth::publicUser();
}
При $remember = true браузер получает случайный 256-битный токен. В базе
хранится только его SHA-256, время создания, абсолютного истечения и последней
активности. Успешное восстановление меняет токен; повторное использование старого
значения отклоняется. Выход удаляет и cookie, и серверную запись.
Где управлять регистрацией
Email-регистрация является частью AVE.cms и не требует отдельного модуля.
Откройте Система -> Пользователи сайта -> Регистрация. На одной странице
настраиваются:
- доступность регистрации и способ активации аккаунта;
- группа, в которую попадёт новый пользователь;
- базовые поля формы, длина пароля и сроки одноразовых ссылок;
- запрещённые email и домены;
- добровольное создание аккаунта при оформлении заказа;
- согласие с политикой и письмо, по которому покупатель задаёт пароль.
Разметка публичных форм находится в соседней вкладке Страницы входа.
Дополнительные поля регистрации и профиля собираются во вкладке Поля профиля.
VK ID, Яндекс и вход по SMS являются дополнительными устанавливаемыми способами
входа, но создают или связывают ту же учётную запись пользователя сайта.
Телефонный аккаунт может существовать без email. Подтверждённый номер хранится в нормализованном международном формате и является уникальным. Такой пользователь входит одноразовым SMS-кодом; email при необходимости добавляет администратор в профиле пользователя сайта.
Страницы личного кабинета
Адреса входа, регистрации, восстановления доступа и кабинета настраиваются в
Система -> Пользователи сайта -> Страницы входа. Там же редактируются их
Twig-шаблоны. В чистой системе используются следующие адреса:
| Страница | Адрес |
|---|---|
| Обзор кабинета | /personal/overview |
| Профиль | /personal |
| Смена пароля | /personal/password |
| Заказы | /personal/orders |
| Избранное | /personal/favorites |
| Просмотренные товары | /personal/viewed |
Обзор кабинета показывает данные текущего пользователя и, если установлен Commerce, количество заказов, оплаченных заказов, избранных товаров и последние заказы. Commerce остаётся необязательным: без него обзор не падает и служит быстрым переходом к профилю.
Шаблон страницы можно хранить в Adminx или в активной теме. Приоритет источников:
- сохранённый в Adminx шаблон;
templates/<theme>/views/system_auth/<page>.twig;- штатный шаблон
system/App/Frontend/Auth/view/<page>.twig.
Для обзора доступны user, auth_urls, orders_total, orders_paid,
favorites_count и массив orders. Адреса следует брать из auth_urls, а не
вписывать строками: администратор может изменить их в настройках.
Регистрация после заказа
Если установлен модуль корзины, новый покупатель может оформить заказ как гость или включить создание личного кабинета. Для уже известного email форма предложит войти, не теряя текущую корзину. Для нового email потребуется отдельное согласие с политикой обработки данных.
После успешного заказа система связывает заказ с новым аккаунтом, открывает этот аккаунт в текущем браузере и отправляет одноразовую ссылку задания пароля. Пароль в письме не передаётся. Выключение сценария не блокирует гостевое оформление.
В шаблоне письма доступны user.firstname, user.lastname, user.email,
order.id, order.total, access_url и expires_hours. Ошибка Twig проверяется
до сохранения настроек.
Практика
- В контроллере панели обычно достаточно
Auth::id()для «автора действия» иPermission::check()для доступа. - Не путайте идентификаторы:
Auth::user()возвращает системную запись RBAC,Auth::publicUser()— связанный публичный профиль. - Сессия и cookie общие для сайта и панели (host-only), поэтому вход сохраняется при переходах — см. Сессии и CSRF.
- Авторизованный сотрудник автоматически входит и на публичных страницах: профиль, корзина и история заказов используют его связанную публичную запись.
- Не читайте и не записывайте cookie
authиз модуля напрямую. ИспользуйтеAuth::publicAttempt(),Auth::publicLoginById()иAuth::publicLogout().