feat(web-api): учитывать ACL групп ресурсов в публичном каталоге - #666
feat(web-api): учитывать ACL групп ресурсов в публичном каталоге#666Ibochkarev wants to merge 4 commits into
Conversation
|
Спасибо — охват Web API проверил, он полный и аккуратный. Фильтр подключён везде, где нужно: Реализация через Условие по контексту Числа: мерж с Но два момента нужно закрыть до вливания. 1. Ресурс с явным грантом анониму скрывается, хотя должен быть виден
Настоящая семантика другая. В MODX есть псевдогруппа «(anonymous)» с WHERE acl.principal_class = 'MODX\Revolution\modUserGroup'
AND acl.principal = 0
AND (acl.context_key = :context OR acl.context_key IS NULL OR acl.context_key = '')То есть если админ явно разрешил анониму, ресурс виден — даже когда для той же группы ресурсов есть ограничения для других групп пользователей. Проверено эмпирически на живой базе, в транзакции с откатом:
Сценарий не выдуманный: группы ресурсов часто используют для сайта целиком, а не только для магазина, и связка «ограничения для одних групп плюс явный грант анониму» — обычная настройка. После обновления такие товары исчезнут из каталога молча: ни ошибки, ни записи в лог. Владелец узнает от покупателей. Это как раз тот тип ошибки, который опаснее исходной утечки: потерять товары хуже, чем показать лишние, потому что утечка пассивна, а пропажа ломает продажи. Починка — исключение для 2. Тесты проверяют форму запроса, а не результат
Именно поэтому случай с анонимом и не пойман — форма запроса правильная, результат неправильный. Комментарий в Прошу интеграционный тест на четыре случая: ресурс без группы; группа без единой ACL-записи; группа с ACL только для чужой группы пользователей; группа с явным грантом анониму. Отдельно — про масштаб, не к правке в этом PRКлассический Fenom-сниппет Значит на обычной, не headless инсталляции — а это сегодня подавляющее большинство магазинов на MS3 — закрытые группы ресурсов по-прежнему не учитываются. Это не регрессия от твоего PR, поведение сниппета не менялось. Но означает, что #659 после вливания закрывается только для Web API. Завёл отдельную задачу на классическую витрину — там своя работа со своими вопросами, встроить фильтр в pdoTools-путь одной строкой не выйдет. А в описании релиза надо будет честно написать, что Web API закрытые группы теперь уважает, а Fenom-витрина пока нет. |
Resolve ProductFacetService import conflict: keep CatalogQuery context validation from beta and CatalogResourceGroupVisibility from #666.
|
@biz87 Спасибо за ревью — оба пункта закрыл. 1. Грант анониму (
|
Resolve CatalogResourceGroupVisibility conflict: keep #669 auth path and apply principal=0 / principal_class semantics to protected SQL.
ebb9dcf to
258219e
Compare
Authenticated catalog visitors resolve allowed resource groups via a customer group → modUserGroup link, reusing the #666 SQL visibility gate.
|
Первый пункт возврата закрыт по-настоящему, и это проверено не на моках. Анонимный грант внутри одной группы теперь работает: SQL прогнан против реальной схемы dev-стенда, в транзакции с откатом, по шести сценариям. Ресурс без групп виден, ресурс в группе с ACL только для чужой группы скрыт, ресурс с явным грантом Второй пункт тоже закрыт: Числа: мерж с актуальной Но на шестом сценарии — том самом, про множественное членство, — обнаружился баг того же класса. Ресурс в нескольких группах скрывается, хотя должен быть виденСценарий: ресурс состоит в двух группах ресурсов. Группа A ограничена — есть ACL для какой-то группы пользователей, анонимного гранта нет. Группа B открыта анониму. По семантике ядра такой ресурс виден. Членство работает как ИЛИ: достаточно, чтобы доступ давала хотя бы одна из групп. Это видно в Текущий SQL даёт Причина в корреляции. Внутренний Сценарий бытовой, не экзотический: товар лежит в общей открытой группе и заодно попал в какую-то закрытую — и пропадает с витрины. Это снова ложное скрытие, то есть молчаливая потеря товаров, которая хуже исходной утечки. Тестов на этот случай нет ни в Почему это важно починить именно здесьНа ветке этого PR стоят два зависимых, и оба берут этот SQL как готовый:
Сейчас это одна правка в одном месте. После ребейза стека — три параллельные правки в трёх PR, которые придётся синхронизировать. Направление правки: развязать анонимную проверку от привязки к конкретной строке Второе, не блокирующее
Понимаю, что поднять ACL-таблицы в SQLite-харнессе — отдельная работа. Но раз новый SQL-тест уже умеет создавать |
|
Исправлено в Анонимный грант больше не коррелирует с
Сценарий «закрытая A + открытая анониму B» даёт visible. Две закрытые группы — по-прежнему скрывают. Покрытие:
|
Authenticated catalog visitors resolve allowed resource groups via a customer group → modUserGroup link, reusing the #666 SQL visibility gate.
Hide anonymous catalog (and cart add) resources that belong to groups with Resource Group Access ACL; toggle via ms3_web_catalog_respect_resource_groups. Closes #659
validateProduct uses newQuery only when RG ACL is enabled; SQLite cart stubs disable the setting so getObject(array) path still works in CI.
Align catalog RG SQL with MODX anonymous ACL: hide only when a non-anonymous ACL closes the group and no principal=0 grant exists. Add SQLite execution coverage for the four review cases.
Multi-group membership is OR in modAccessibleObject::checkPolicy. Correlating the anon NOT EXISTS to the same document_group hid resources that also belonged to an open group.
8bd5f3e to
286c7f0
Compare
Authenticated catalog visitors resolve allowed resource groups via a customer group → modUserGroup link, reusing the #666 SQL visibility gate.
Описание
Публичный Web API каталог (и добавление в корзину) для анонимных запросов скрывает товары и категории, входящие в группу ресурсов MODX с ACL «Доступ к группе ресурсов» для контекста запроса. Новая настройка
ms3_web_catalog_respect_resource_groups(по умолчанию включена); также учитывается MODXaccess_resource_group_enabled.Продуктовое решение по #659: позиция B (уважать resource groups), MVP только для anonymous — без маппинга
msCustomer↔modUser.Тип изменений
Связанные Issues
Closes #659
Как это было протестировано?
cd core/components/minishop3 php -l src/Services/Catalog/CatalogResourceGroupVisibility.php php -l src/Services/Product/ProductCatalogService.php php -l src/Services/Category/CategoryCatalogService.php php -l src/Services/Cart/CartItemManager.php php tests/CatalogResourceGroupVisibilityTest.php php tests/ProductCatalogServiceTest.php php tests/CategoryCatalogServiceTest.php ./vendor/bin/phpunit tests/Unit/Services/Cart/CartItemManagerPureTest.phpКонфигурация тестирования:
feat/issue-659-catalog-resource-groupsЧеклист
composer ci:php— в CIДополнительные заметки
NOT EXISTSпоmodResourceGroupResource+modAccessResourceGroup(без N+1checkPolicy).CatalogResourceGroupVisibility: product get/list/filters, category get/list/tree/breadcrumbs,CartItemManager::validateProduct.msCustomer, Delivery/Payment, сниппеты.