02 - Разрешения
В Joomla есть очень сложная система разрешений, и если вы с ней не знакомы, вам следует сначала просмотреть некоторые вводные материалы. Я бы порекомендовал Учебное пособие по списку контроля доступа и видео, в котором описывается ACL для Joomla 3 с Рэнди Кэри (для просмотра требуется от 2 до 32 минут). Оба они связаны с Joomla 3, но ACL не изменился между версией Joomla 3 и версией 4 или 5.
Разрешения - представление реализации
Разрешения хранятся в Joomla #__assets
таблица, в rules
столбец. Если у вас установлена чистая Joomla, в assets
запись для com_content
(т. е. запись, в которой name
столбец "com_content") у вас будет запись в rules
столбец, аналогичный (но, вероятно, не совсем такому же, как) строке json:
{ "core.admin":{"7":1}, "core.manage":{"6":1}, "core.create":{"3":1}, "core.edit":{"4":1,"2":1}, "core.edit.state":{"5":1}, "core.execute.transition":{"6":1,"5":1}, "core.delete":{"2":0} }
Это означает, что на com_content
Уровень:
- Для группы пользователей с правами доступа "core.admin" "7" имеет значение 1 (которое разрешено )
- Для группы пользователей с разрешением "core.manage" "6" имеет значение 1 ( Разрешено )
- (аналогично для следующих нескольких разрешений)
- Для группы пользователей "core.delete" разрешение "2" имеет значение 0 ( Отказано ).
Для этих разрешений, где группа пользователей не указана, это означает, что значение наследуется .
Приведенные выше значения отражают то, что задано в конфигурации системы для статей (вкладка "Разрешения").
На рисунке показаны разрешения для зарегистрированной группы пользователей, которая в моем экземпляре Joomla имеет группу пользователей "2". Я установил разрешения таким образом, чтобы разрешения этой группы пользователей в строке JSON выше были:
- "core.edit" - установлено значение 1 - Разрешено
- "core.удалить" - установлено значение 0 - Отказано Другие разрешения не установлены, и поэтому по умолчанию они являются унаследованными .
Действия по разрешению
Вот типы действий, которые могут выполнять пользователи. Большинство из них самоочевидны, но некоторые могут потребовать небольшого пояснения.
" core.admin " - это описывается как "Настройка ACL и параметров" на уровне конфигурации компонента и "Poweruser" на уровне глобальной конфигурации.
Пользователь с разрешением "core.admin" на уровне конфигурации компонента, но не на уровне сайта, может выполнять любые действия, относящиеся к этому компоненту, но общесистемные действия будут ему недоступны.
Пользователь с разрешением "core.admin" на уровне сайта Joomla (т.е. Глобальная конфигурация) полностью неограничен и может выполнять любые действия на сайте.
" core.options " - описывается как "Параметры настройки" или "Только параметры настройки" (в зависимости от версии Joomla). Определяет, может ли пользователь настраивать параметры
- в глобальной конфигурации (если разрешение поддерживается на глобальном уровне)
- для отдельного компонента (если разрешение предоставляется на уровне компонента).
" core.manage " - описывается как "Доступ к интерфейсу администрирования". Пользователь с этим разрешением может получить доступ к серверной части администратора и выполнять административные функции более низкого уровня, такие как проверка элементов.
Иерархия активов
Как показано на диаграмме, активы хранятся в иерархии, реализованной в виде структуры вложенного набора в #__assets
таблица. Это позволяет установить разрешения более высокого уровня, а затем распространить их на элементы более низкого уровня.
Для com_content
самый низкий уровень - это отдельная статья, затем, поднимаясь вверх, мы получаем:
- категория статьи
- родительская категория этой категории (и так далее, пока не будет достигнута самая верхняя родительская категория)
- разрешения com_content
- разрешения на глобальную конфигурацию
Как Joomla определяет, может ли пользователь выполнить то или иное действие
Давайте рассмотрим, как Joomla проверяет, может ли пользователь редактировать статью. Вот шаги (это логические шаги - фактический код is разработан по-другому, чтобы быть более производительным).:
- Определитесь с разрешением - допустим, в данном случае это "core.edit".
- Найдите все группы пользователей, к которым принадлежит пользователь. Они будут включать группу пользователей или группы пользователей, к которым пользователь непосредственно приписан, плюс предки этих групп пользователей.
- Получите правила разрешения для статьи. Например, если идентификатор статьи равен 22, то для этого потребуется найти запись активов с именем = "com_content.article.22" и просмотреть
rules
поле. - Перейдите вверх по таблице активов (используя
parent
поле) и получите правила разрешения для всех предков. Это происходит по иерархии категорий, связанных со статьей, черезcom_content
разрешения, вплоть до корневых разрешений, установленных в Глобальной конфигурации. - Ищите записи, относящиеся к "core.edit", в этих наборах правил для каждой из групп пользователей, к которым принадлежит пользователь:
- Если найдено правило, в котором одной из групп пользователей пользователя присваивается значение 0 (т.е. Отказано), то пользователю не разрешается выполнять это действие. Значение "Запрещено" на любом уровне иерархии активов для любой из групп пользователей, к которым принадлежит пользователь (прямо или косвенно), будет означать, что пользователю не разрешено выполнять действие.
- Если ни для одной из групп пользователей пользователя не найдено Запрещенное значение, то если для любой из групп пользователей пользователя есть хотя бы одна запись, имеющая значение 1 (Разрешено), то пользователю разрешается выполнить действие.
- Если ни в одном из правил иерархии активов нет записей ни для одной из групп пользователей пользователя, то пользователю не разрешается выполнять это действие.
Проверка разрешений в вашем расширении
Joomla не применяет волшебным образом правила разрешений для контроля того, что пользователи могут или не могут делать в вашем расширении. Вы сами должны определить, какая строка разрешений подходит для действия, и вызвать функции библиотеки Joomla, чтобы проверить, есть ли у пользователя разрешения на выполнение этого действия.
Например, чтобы проверить, может ли пользователь редактировать статью (скажем, с id = 22), используйте:
$user = Factory::getApplication()->getIdentity(); $allowed = $user->authorise('core.edit', 'com_content.article.22');
Переменная $allowed
будет установлено значение true
или false
, в зависимости от того, разрешено ли пользователю выполнять это действие или нет.
Или, чтобы проверить, может ли пользователь создать контакт:
$allowed = $user->authorise('core.create', 'com_contact');
Если вы хотите проверить ряд разрешений на уровне компонента (например, для отображения панели инструментов в представлении компонента), вы можете использовать:
use Joomla\CMS\Helper\ContentHelper; … $canDo = ContentHelper::getActions('com_example'); if ($canDo->get('core.create')) { // отобразить новую кнопку } if ($canDo->get('core.delete')) { // отобразить кнопку удаления } // etc