Skip to content

fix(install): выдать политику MiniShop3 группам с доступом в админку (#893) - #894

Merged
biz87 merged 2 commits into
betafrom
fix/893-admin-permissions
Oct 14, 2026
Merged

biz87 merged 2 commits into
betafrom
fix/893-admin-permissions

Conversation

@biz87

@biz87 biz87 commented Oct 14, 2026 •

Copy link
Copy Markdown
Member

Закрывает #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 → политика Administrator (authority 0)
ПОСЛЕ:  группа Administrator → политика Administrator (authority 0)
        группа Administrator → политика miniShopManagerPolicy (authority 9999)

Политики при этом не тронуты: Administrator 185 прав, Content Editor 37, Developer 147 — как были. Повторный прогон дублей не создаёт.

authority = 9999 — как в miniShop2: политика добавочная, собственные права группы остаются главнее.

Что учтено из ревью

Замечание Как закрыто
Content Editor получал покупателей с контактами и право их удалять снято: чужие политики не правятся. Права достаются группе, только если у неё уже есть вход в админку
Нет flushPermissions(), права не доедут до залогиненных добавлен; лишний refresh() убран
Сырые ключи perm.*_desc в описаниях прав неактуально: в чужие шаблоны ничего не пишем
Список прав продублирован вместо чтения конфига неактуально: список прав резолверу больше не нужен
Права регистрируются только в AdministratorTemplate неактуально по той же причине
Группа «MiniShop3 Managers» нерабочая без frames группа не создаётся; отдельный сценарий «менеджер без админских прав» вынесен из этого PR
Нет тестов на резолвер добавлен AccessGrantResolverTest

Отдельно из ревью подтвердилось, что msorder_* закрывают не только заказы, но и покупателей, их адреса и группы покупателей. Это свойство самого компонента, не этого PR, — вынесено в #895.

Проверки

Что осталось за рамками

  • Снятие прав при удалении компонента (ACTION_UNINSTALL).
  • Готовая группа для менеджера магазина без админских прав: miniShopManagerPolicy не содержит frames, поэтому такой пользователь в админку не войдёт — нужен продуманный набор прав, это отдельная задача.

biz87 added 2 commits October 15, 2026 00:25
На свежей установке права компонента не попадали ни в одну политику:
они существовали только в 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.
@biz87 biz87 changed the title fix(install): выдать права MiniShop3 политикам доступа (#893) fix(install): выдать политику MiniShop3 группам с доступом в админку (#893) Oct 14, 2026
@biz87
biz87 merged commit ecfe817 into beta Oct 14, 2026
6 checks passed
@biz87
biz87 deleted the fix/893-admin-permissions branch October 14, 2026 20:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant