В 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 Permissions Example

На рисунке показаны разрешения для зарегистрированной группы пользователей, которая в моем экземпляре Joomla имеет группу пользователей "2". Я установил разрешения таким образом, чтобы разрешения этой группы пользователей в строке JSON выше были:

  • "core.edit" - установлено значение 1 - Разрешено
  • "core.удалить" - установлено значение 0 - Отказано Другие разрешения не установлены, и поэтому по умолчанию они являются унаследованными .

Действия по разрешению

Вот типы действий, которые могут выполнять пользователи. Большинство из них самоочевидны, но некоторые могут потребовать небольшого пояснения.

" core.admin " - это описывается как "Настройка ACL и параметров" на уровне конфигурации компонента и "Poweruser" на уровне глобальной конфигурации.

Пользователь с разрешением "core.admin" на уровне конфигурации компонента, но не на уровне сайта, может выполнять любые действия, относящиеся к этому компоненту, но общесистемные действия будут ему недоступны.

Пользователь с разрешением "core.admin" на уровне сайта Joomla (т.е. Глобальная конфигурация) полностью неограничен и может выполнять любые действия на сайте.

" core.options " - описывается как "Параметры настройки" или "Только параметры настройки" (в зависимости от версии Joomla). Определяет, может ли пользователь настраивать параметры

  • в глобальной конфигурации (если разрешение поддерживается на глобальном уровне)
  • для отдельного компонента (если разрешение предоставляется на уровне компонента).

" core.manage " - описывается как "Доступ к интерфейсу администрирования". Пользователь с этим разрешением может получить доступ к серверной части администратора и выполнять административные функции более низкого уровня, такие как проверка элементов.

Иерархия активов

Joomla Asset Hierarchy

Как показано на диаграмме, активы хранятся в иерархии, реализованной в виде структуры вложенного набора в #__assets таблица. Это позволяет установить разрешения более высокого уровня, а затем распространить их на элементы более низкого уровня.

Для com_content самый низкий уровень - это отдельная статья, затем, поднимаясь вверх, мы получаем:

  • категория статьи
  • родительская категория этой категории (и так далее, пока не будет достигнута самая верхняя родительская категория)
  • разрешения com_content
  • разрешения на глобальную конфигурацию

Как Joomla определяет, может ли пользователь выполнить то или иное действие

Давайте рассмотрим, как Joomla проверяет, может ли пользователь редактировать статью. Вот шаги (это логические шаги - фактический код is разработан по-другому, чтобы быть более производительным).:

  1. Определитесь с разрешением - допустим, в данном случае это "core.edit".
  2. Найдите все группы пользователей, к которым принадлежит пользователь. Они будут включать группу пользователей или группы пользователей, к которым пользователь непосредственно приписан, плюс предки этих групп пользователей.
  3. Получите правила разрешения для статьи. Например, если идентификатор статьи равен 22, то для этого потребуется найти запись активов с именем = "com_content.article.22" и просмотреть rules поле.
  4. Перейдите вверх по таблице активов (используя parent поле) и получите правила разрешения для всех предков. Это происходит по иерархии категорий, связанных со статьей, через com_content разрешения, вплоть до корневых разрешений, установленных в Глобальной конфигурации.
  5. Ищите записи, относящиеся к "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