Repository navigation
fix(install): выдать политику MiniShop3 группам с доступом в админку (#893) - #894
Merged
Merged
Conversation
На свежей установке права компонента не попадали ни в одну политику: они существовали только в miniShopManagerPolicy, которая никому не назначена. Любой администратор без sudo получал «Access denied. Required permission: msproduct_save» и не мог сохранить ни товар, ни категорию, а галерея падала на msproductfile_list. Первый администратор проблемы не видел, потому что sudo обходит проверки прав целиком. Новый резолвер раздаёт права по признаку, а не по имени группы — так накрываются и кастомные админские политики, которых на боевых сайтах хватает: - политикам с save_document достаётся ежедневная работа магазина: товары, категории, галерея, заказы (11 прав); - политикам с settings — настройки магазина (3 права), редкая и опасная работа, её логично оставить тем, у кого и так есть доступ к системным настройкам. На штатной установке Administrator и Developer получают оба пакета, Content Editor — только первый: иначе редактор может сохранить обычный ресурс, но не товар. Попутно резолвер регистрирует 14 прав в AdministratorTemplate, без чего они не видны в интерфейсе политики и их нельзя переключить вручную, и заводит пустую группу «MiniShop3 Managers» с miniShopManagerPolicy на контекст mgr — для случая, когда человеку нужен магазин без админских прав. Уже присутствующие в политике права не перезаписываются: администратор мог отключить право намеренно, и обновление не должно это переигрывать. Повторный прогон ничего не меняет. После правки политик сбрасывается кэш, иначе изменения не вступят в силу до ручной очистки.
…893) Переписано по модели miniShop2 после ревью. Прежняя версия дописывала права в чужие политики — Administrator, Developer, Content Editor. Ревью показало два изъяна: контент-редактор вместе с товарами получал список покупателей с контактами и право их удалять (эти роуты закрыты msorder_*), а без flushPermissions() права не доезжали до тех, кто уже залогинен, потому что ACL живёт в сессии и перечитывается только по метке session_stale. Теперь резолвер чужие политики не трогает вовсе. Он выдаёт готовую miniShopManagerPolicy тем группам, у которых уже есть доступ к контексту mgr, — ровно то, что делал resolve.policy.php в miniShop2, только не для одной штатной группы Administrator, а для всех: на боевых сайтах администраторы нередко сидят в своей группе. Кого пускать в админку, решает владелец сайта; компонент лишь добавляет магазин тем, кто уже внутри. Эта часть при переносе из miniShop2 потерялась: resolver_09 привязывает политику к шаблону, но никому её не назначает, поэтому права компонента не доставались никому, кроме sudo. После выдачи вызывается flushPermissions() — иначе залогиненный администратор увидит права только после перелогина. Отдельный refresh() не нужен: кэш после установки пакета сбрасывает процессор установки. Резолвер работает и на обновлении, поэтому существующие сайты получают права тем же проходом. Повторный прогон дублей не создаёт. Тест AccessGrantResolverTest проверяет статически: резолвер отрабатывает на install и upgrade, выдаёт политику через modAccessContext в контекст mgr, ссылается на политику под тем же именем, что объявлено в manager_access_policy.php, не переписывает data чужих политик, проверяет существование записи перед вставкой и зовёт flushPermissions.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Закрывает #893.
Проблема
На свежей установке права компонента не достаются никому: они лежат только в
miniShopManagerPolicy, а та не назначена ни одной группе. Любой администратор безsudoупирается в «Access denied. Required permission:msproduct_save» и не может сохранить ни товар, ни категорию; галерея отдельно падает наmsproductfile_list.Первый администратор сайта проблемы не видит — у него
sudo = 1, а sudo обходит проверки прав целиком. Поэтому поломка всплывает только когда появляется второй администратор.Откуда взялось. В miniShop2 этим занимался
resolve.policy.php: он привязывал политику к шаблону и выдавал её группе Administrator черезmodAccessContext. При переносе в MiniShop3 осталась только первая половина —resolver_09_policies.phpпривязывает политику к шаблону, но никому её не назначает. По истории видно, чтоmodAccessContextв резолверах MiniShop3 не было никогда.Решение
Новый резолвер
resolver_12_access_permissions.phpвыдаётminiShopManagerPolicyтем группам, у которых уже есть доступ к контекстуmgr.Это модель miniShop2 с одним расширением: политика достаётся не только штатной группе Administrator, но всем группам со входом в админку — на боевых сайтах администраторы нередко сидят в своей группе. Кого пускать в админку, решает владелец сайта; компонент лишь добавляет магазин тем, кто уже внутри.
Чужие политики не изменяются вовсе — ни Administrator, ни Developer, ни Content Editor.
После выдачи вызывается
flushPermissions(). Без него залогиненный администратор прав не увидит: ACL живёт в сессии и перечитывается только когда контекст помечен вsession_stale, а обычныйrefresh()сессий не касается — по этой же причине его зовут штатные процессоры политик. Отдельныйrefresh()не нужен: кэш после установки пакета сбрасывает процессор установки.Существующие сайты
Резолвер отрабатывает и на
ACTION_UPGRADE, так что работающие сайты получают права тем же проходом. Проверено на стенде именно в режиме обновления:Политики при этом не тронуты: Administrator 185 прав, Content Editor 37, Developer 147 — как были. Повторный прогон дублей не создаёт.
authority = 9999— как в miniShop2: политика добавочная, собственные права группы остаются главнее.Что учтено из ревью
flushPermissions(), права не доедут до залогиненныхrefresh()убранperm.*_descв описаниях правAdministratorTemplateframesAccessGrantResolverTestОтдельно из ревью подтвердилось, что
msorder_*закрывают не только заказы, но и покупателей, их адреса и группы покупателей. Это свойство самого компонента, не этого PR, — вынесено в #895.Проверки
tests/run-smoke.php— 122 теста, включая новый.Что осталось за рамками
ACTION_UNINSTALL).miniShopManagerPolicyне содержитframes, поэтому такой пользователь в админку не войдёт — нужен продуманный набор прав, это отдельная задача.