Repository navigation
[Bug] Администратор без sudo не может сохранить товар и категорию: права MiniShop3 не выданы ни одной политике #893
Description
Версия: 1.14.1-beta2
Важность: блокирующая — на свежей установке администратор, кроме самого первого (sudo), не может сохранить ни товар, ни категорию.
Что происходит
На чистом MODX 3 со свежим MiniShop3 заводим второго пользователя, добавляем в группу Administrator с ролью Super User, входим под ним:
- карточка категории →
Access denied. Required permission: mscategory_save; - карточка товара →
Access denied. Required permission: msproduct_save, плюсРазрешение 'msproductfile_list' необходимо для 'MiniShop3ProcessorsGalleryGetList'; - сохранение заблокировано.
Обычные ресурсы при этом сохраняются: право save_document у группы есть.
Первый администратор проблемы не видит, потому что у него sudo = 1, а sudo обходит проверки прав целиком. Поэтому поломка всплывает только когда на сайте появляется второй администратор.
Почему
Установка заводит шаблон miniShopManagerPolicyTemplate с 14 правами и политику miniShopManagerPolicy, но:
- не добавляет эти права ни в одну из существующих политик;
- не привязывает
miniShopManagerPolicyни к одной группе; - не создаёт своей группы.
Состояние после установки (проверено на стенде):
| Политика | Прав | Права MiniShop3 |
|---|---|---|
| Administrator | 185 | нет ни одного |
| Developer | 147 | нет ни одного |
| Content Editor | 37 | нет ни одного |
| miniShopManagerPolicy | 14 | все 14, но политика никому не назначена |
Записей modAccessContext с этой политикой — ноль.
Дальше срабатывает проверка в контроллере карточки товара, core/components/minishop3/controllers/product/update.class.php:136:
'canSave' => (int) ($this->canSave && $this->modx->hasPermission('msproduct_save')),Родительский контроллер уже учёл save_document, блокировку и политику ресурса, а MiniShop3 добавляет сверху своё право, которого ни у кого нет. То же самое делают роуты Manager API через PermissionMiddleware.
Что предлагается
1. Раздать права существующим политикам по признаку, а не по имени группы.
Права в MODX выдаются политике, поэтому перебирать пользователей не нужно: один проход по политикам закрывает и новые установки, и существующие, включая кастомные админские политики, которых на боевых сайтах хватает.
Два пакета:
| Пакет | Права | Кому |
|---|---|---|
| Ежедневная работа магазина | mscategory_save, msproduct_save, msproduct_publish, msproduct_delete, msproductfile_save, msproductfile_generate, msproductfile_list, msorder_save, msorder_view, msorder_list, msorder_remove |
политикам, где есть save_document |
| Настройки магазина | mssetting_save, mssetting_view, mssetting_list |
политикам, где есть settings |
Разделение по смыслу: товары, галерея и заказы — ежедневная работа одних и тех же людей, а настройки магазина — редкая и опасная, их логично оставить тем, кто и так имеет доступ к системным настройкам.
На штатной установке это даёт: Administrator и Developer получают оба пакета, Content Editor — только первый.
2. Добавить 14 прав в AdministratorTemplate.
Иначе они не появятся в списке политики и администратор не сможет их отключить вручную.
3. Создать группу для менеджеров магазина с политикой miniShopManagerPolicy на контекст mgr — для случая, когда человеку нужен магазин без админских прав. Группа создаётся пустой, пользователей в неё добавляют сами.
Требования к реализации
- Идемпотентность. Резолвер выполняется и при установке, и при обновлении: повторный прогон не должен плодить дубли прав и записей доступа.
- Не перезаписывать чужое. Если право уже присутствует в политике — не трогать его значение: администратор мог отключить его намеренно.
- Очистка кэша после правки политик, иначе изменения не вступят в силу до ручного сброса.
- Удаление компонента. Права MiniShop3 стоит убирать из чужих политик при деинсталляции, чтобы не оставлять мусор.
Activity
fix(install): выдать политику MiniShop3 группам с доступом в админку (#…
fix(install): выдать политику MiniShop3 группам с доступом в админку (#…
chore(release): 1.14.2-beta1 (#911)