Skip to content

fix(manager-api): tighten ACL on customers and category products#400

Open
Ibochkarev wants to merge 2 commits into
betafrom
fix/issue-378-manager-api-permissions
Open

fix(manager-api): tighten ACL on customers and category products#400
Ibochkarev wants to merge 2 commits into
betafrom
fix/issue-378-manager-api-permissions

Conversation

@Ibochkarev

@Ibochkarev Ibochkarev commented Jul 16, 2026

Copy link
Copy Markdown
Member

Описание

Мутации покупателей и товаров категории в Manager API были доступны с одним view_document. Content editor мог удалять клиентов и публиковать товары, хотя inline product-data уже требовал msproduct_save.

Права выровнены с legacy processors: customers → msorder_list|view|save|remove; category products → view_document только на GET, msproduct_save на sort, msproduct_delete на bulk, msproduct_publish на publish; /multiple — route gate (AnyPermissionMiddleware) + точная проверка по method через CategoryProductActionPermissions::evaluate().

Тип изменений

  • Исправление бага (non-breaking change)
  • Новая функциональность (non-breaking change)
  • Breaking change (изменение, ломающее обратную совместимость)
  • Рефакторинг (без изменения функциональности)
  • Документация
  • Другое (опишите):

Связанные Issues

Closes #378

Как это было протестировано?

  • Ручное тестирование
  • Автоматические тесты (PHPStan, ESLint)
  • Тестирование на разных версиях PHP/MODX

Конфигурация тестирования:

  • MiniShop3: ветка fix/issue-378-manager-api-permissions
  • MODX: n/a (unit)
  • PHP: локальный CLI

Команды (exit 0):

  • php -l на затронутых PHP
  • php tests/CategoryProductActionPermissionsTest.php — map + 403 forbidden + 400 unknown method + no escalation via wrong permission
  • остальные tests/*.php

Ручной сценарий issue (роль только с view_document → DELETE customer / publish) на стенде не гоняли.

Скриншоты (если применимо)

До После
n/a n/a

Чеклист

  • Код соответствует стилю проекта
  • Добавлены/обновлены комментарии в сложных местах
  • Изменения не ломают существующую функциональность
  • Лексиконы добавлены на двух языках (ru/en)
  • PHPStan проходит без новых ошибок
  • ESLint проходит без ошибок (для JS/Vue изменений)
  • Обновлён CHANGELOG.md (для значимых изменений)

Дополнительные заметки

Смена контракта: unknown method в POST /products/multiple

Было Стало
Неизвестный method warn в лог → цикл без мутаций → 500 «No products were updated» сразу 400 «Unknown method» (до обработки ids)
Нет permission фактически доступ при view_document 403 с текстом Required permission: …

Клиенты, которые ожидали 500 на мусорный method, получат 400. Семантика корректнее; это осознанное ужесточение ответа, не silent break бизнес-логики.

Permission ↔ routes (этот PR)

Route group Permission
GET /customers, addresses list msorder_list
GET /customers/{id} msorder_view
PUT customer / address create+update msorder_save
DELETE customer / bulk / address msorder_remove
GET category products / filters view_document
POST sort msproduct_save
DELETE bulk msproduct_delete
POST publish msproduct_publish
POST multiple any of publish/delete/save + per-method evaluate()

Notes for reviewers

Replace group-level view_document with msorder_* / msproduct_* permissions
aligned to legacy processors so content editors cannot mutate via mgr API.
@Ibochkarev Ibochkarev added priority: high Важно исправить в ближайшее время bug Something isn't working labels Jul 16, 2026
Extract CategoryProductActionPermissions::evaluate() so controller deny
paths are unit-tested without bootstrapping MODX.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working priority: high Важно исправить в ближайшее время

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] Manager API: customers CRUD и category publish под view_document

1 participant