Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Права доступа

В 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->guest1, если пользователь не вошёл
$user->name, $user->usernameИмя и логин
$user->authorise('core.edit', 'com_hello')Разрешено ли действие
$user->getAuthorisedViewLevels()Номера доступных уровней просмотра

Уровни просмотра

Кроме действий есть уровни доступа на чтение: «Public», «Registered», «Special». Их назначают модулям, пунктам меню и статьям: модуль с уровнем «Registered» гость не увидит. Чтобы ограничивать так записи своего компонента, в таблицу добавляют столбец access и сравнивают его со списком из getAuthorisedViewLevels().

Частая ошибка

Права проверяют только в макете: кнопку «Удалить» скрыли — и считают дело сделанным. Скрытая кнопка не мешает отправить запрос напрямую. Проверка authorise() должна стоять там, где действие выполняется, — в контроллере или модели.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.