Как работает Joomla Access

Элементы Joomla, такие, как Статьи, Контакты и Menuitems, имеют поле доступа, которое используется для определения, может ли пользователь просматривать этот элемент или нет.

Значение поля доступа называется "Просмотр уровня доступа", и в основном это целочисленное значение, с которым связано имя; имена этих уровней можно увидеть на серверной части администратора, выбрав Пользователи / Уровни доступа.

В той же форме вы можете увидеть группы пользователей с доступом к просмотру этого уровня. Администратор указывает группы пользователей, которые могут видеть элемент с этим уровнем доступа.

Когда администратор редактирует запись пользователя, он может установить на вкладке "Назначенные группы пользователей" группы пользователей, к которым принадлежит этот пользователь. Группы пользователей имеют иерархическую (древовидную) структуру, так что если пользователь принадлежит к группе пользователей, которая является дочерней по отношению к другой, то этот пользователь также является членом родительской группы пользователей.

Например, при использовании групп пользователей Joomla по умолчанию группа пользователей Administrator является дочерней по отношению к группе пользователей Manager, поэтому пользователь, которому назначена группа пользователей Administrator, также автоматически будет принадлежать к группе пользователей Manager.

Joomla Access levels

Обратившись к диаграмме, предположим, что пользователь принадлежит к группам пользователей (столбцам) A, C и D. Пользователь может быть назначен непосредственно к одной из этих групп или может принадлежать к ней, поскольку она находится в родительской цепочке группы пользователей, к которой был назначен Пользователь.

Цветные ромбы обозначают различные уровни доступа к сайту Joomla.

Светло-синий уровень доступа обеспечивает видимость для групп пользователей A, D и E.

Поскольку Пользователь принадлежит к группам пользователей A и D, любой элемент, имеющий светло-синий уровень доступа, должен быть виден этому пользователю.

Если Пользователь принадлежит к любой группе пользователей, которая связана с Уровнем доступа, то этот пользователь должен иметь возможность просматривать ее. Не имеет значения, что Пользователь не принадлежит ко всем Группам пользователей, связанным с Уровнем Доступа.

Красный уровень доступа обеспечивает видимость только для пользователей группы E.

Поскольку пользователь не принадлежит к группе пользователей E, любой элемент, имеющий красный уровень доступа, не должен быть виден этому пользователю.

Следуя этому подходу, вы должны увидеть, что пользователь должен иметь доступ к пункту 5, но не к пунктам 3 или 4.

Подход к кодированию

Важно понимать, что Joomla не применяет волшебным образом правила доступа для обеспечения того, чтобы посетители веб-сайта видели только то, что им должно быть разрешено видеть. При написании кода своего расширения вы должны следовать примеру основных компонентов Joomla и применять Access Framework к своему расширению. Joomla действительно предоставляет библиотечные функции, которые позволяют вам (и разработчикам основных компонентов и модулей Joomla) легко применять правила доступа.

При проверке доступа в вашем коде самый простой подход заключается в использовании User::getAuthorisedViewLevels функция:

$user = Factory::getApplication()->getIdentity();
$levels = $user->getAuthorisedViewLevels();

Функция getAuthorisedViewLevels возвращает массив целых чисел, которые являются значениями уровней доступа, которые этот Пользователь должен иметь право просматривать. На диаграмме выше, где уровни доступа представлены цветами, этот массив будет набором цветов, которые пользователь может просмотреть.

(Кстати, иногда в коде Joomla вы увидите $groups = $user->getAuthorisedViewLevels();, создавая впечатление, что функция возвращает массив групп пользователей, но это не так, и код вводит в заблуждение.)

Таким образом, чтобы проверить, может ли Пользователь просматривать определенный элемент, получить значение поля Доступ к элементу и проверить, находится ли это значение в массиве, возвращаемом getAuthorisedViewLevels, например

$levels = $user->getAuthorisedViewLevels();
$canView = in_array($item->access, $levels);

Однако обратите внимание, что суперпользователи должны иметь возможность видеть все элементы независимо от уровня доступа, поэтому, как правило, выполняется еще одна проверка:

 if ($user->authorise('core.admin')) {
   // это супер пользователь - позволить пользователю просмотреть пункт

Если у пользователя нет доступа к просмотру элемента, то вам следует подумать, как лучше сообщить об ошибке.

  • Если пользователь вошел в систему, вы можете захотеть вернуть HTTP-статус 403 (запрещено).
  • Если пользователь не вошел в систему, вы можете вернуть статус 403 или перенаправить пользователя на экран входа в систему с сообщением о необходимости входа в систему, чтобы иметь возможность просмотреть элемент.

Вы можете узнать, вошел ли пользователь в систему или нет, проверив guest свойство объекта User. Например, возвращать 403 с сообщением "не авторизован", если пользователь не вошел в систему:

if ($user->guest) {
    throw new \Exception(Text::_('JERROR_ALERTNOAUTHOR'), 403);
}