Skip to content

[Bug] Администратор без sudo не может сохранить товар и категорию: права MiniShop3 не выданы ни одной политике #893

Open

Description

@biz87

Версия: 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 стоит убирать из чужих политик при деинсталляции, чтобы не оставлять мусор.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions