Права доступа
В Joomla пользователи состоят в группах, а группам разрешают или запрещают действия: создавать, изменять, удалять. Компонент объявляет список своих действий, администратор раздаёт их группам, а код перед каждой операцией спрашивает: «можно ли этому пользователю?».
Файлы
Оба файла создают вручную в корне административной части:
administrator/components/com_hello/
├── access.xml список действий
├── config.xml экран настроек с вкладкой прав
├── hello.xml
└── ...В манифест, в раздел files внутри administration, добавьте две строки:
<filename>access.xml</filename>
<filename>config.xml</filename>Список действий
<?xml version="1.0" encoding="UTF-8"?>
<!-- administrator/components/com_hello/access.xml -->
<access component="com_hello">
<section name="component">
<action name="core.admin" title="JACTION_ADMIN" />
<action name="core.manage" title="JACTION_MANAGE" />
<action name="core.create" title="JACTION_CREATE" />
<action name="core.edit" title="JACTION_EDIT" />
<action name="core.delete" title="JACTION_DELETE" />
</section>
</access>| Действие | Что разрешает |
|---|---|
core.admin | Менять настройки и права компонента |
core.manage | Открывать компонент в панели |
core.create | Создавать записи |
core.edit | Изменять записи |
core.delete | Удалять записи |
Названия JACTION_... — готовые ключи перевода из ядра.
Экран настроек
<?xml version="1.0" encoding="UTF-8"?>
<!-- administrator/components/com_hello/config.xml -->
<config>
<fieldset name="permissions" label="JCONFIG_PERMISSIONS_LABEL">
<field name="rules" type="rules" label="JCONFIG_PERMISSIONS_LABEL"
filter="rules" validate="rules"
component="com_hello" section="component" />
</fieldset>
</config>Поле типа rules выводит таблицу «группа — действие». Чтобы на этот экран можно было попасть, добавьте кнопку в представление списка:
// administrator/components/com_hello/src/View/Posts/HtmlView.php
ToolbarHelper::preferences('com_hello');В списке записей появилась кнопка «Настройки». Нажмите её, откройте вкладку «Права», выберите группу «Manager» и запретите ей действие «Создать».
Проверка в коде
// administrator/components/com_hello/src/View/Posts/HtmlView.php
use Joomla\CMS\Factory;
$user = Factory::getApplication()->getIdentity();
if ($user->authorise('core.create', 'com_hello')) {
ToolbarHelper::addNew('post.add');
}
if ($user->authorise('core.admin', 'com_hello')) {
ToolbarHelper::preferences('com_hello');
}getIdentity() возвращает текущего пользователя, authorise() отвечает true или false. Войдите в панель пользователем из группы «Manager»: кнопки «Создать» больше нет.
Спрятать кнопку недостаточно — адрес действия можно набрать вручную. Но FormController сам проверяет core.create перед add и core.edit перед edit и save, поэтому на адрес task=post.add такой пользователь получит отказ.
Свои действия контроллера
В собственных методах проверку пишут сами:
// administrator/components/com_hello/src/Controller/PostController.php
public function hide(): void
{
$this->checkToken();
if (!$this->app->getIdentity()->authorise('core.edit', 'com_hello')) {
throw new \Exception('Недостаточно прав', 403);
}
// изменить запись…
$this->setRedirect('index.php?option=com_hello&view=posts', 'Запись скрыта');
}Свойства пользователя
| Выражение | Что возвращает |
|---|---|
$user->id | Номер пользователя; 0 у гостя |
$user->guest | 1, если пользователь не вошёл |
$user->name, $user->username | Имя и логин |
$user->authorise('core.edit', 'com_hello') | Разрешено ли действие |
$user->getAuthorisedViewLevels() | Номера доступных уровней просмотра |
Уровни просмотра
Кроме действий есть уровни доступа на чтение: «Public», «Registered», «Special». Их назначают модулям, пунктам меню и статьям: модуль с уровнем «Registered» гость не увидит. Чтобы ограничивать так записи своего компонента, в таблицу добавляют столбец access и сравнивают его со списком из getAuthorisedViewLevels().
Частая ошибка
Права проверяют только в макете: кнопку «Удалить» скрыли — и считают дело сделанным. Скрытая кнопка не мешает отправить запрос напрямую. Проверка authorise() должна стоять там, где действие выполняется, — в контроллере или модели.