Функция cot_auth_build в Cotonti
Функция cot_auth_build используется для построения таблицы прав доступа (Access Control List, ACL) для конкретного пользователя на основе его основной группы и дополнительных групп, в которых он состоит.
Код функции
/**
* Builds Access Control List (ACL) for a specific user
*
* @param int $userid User ID
* @param int $maingrp User main group
* @return array
* @global CotDB $db
*/
function cot_auth_build($userid, $maingrp = 0)
{
global $db, $db_auth, $db_groups_users;
$groups = array();
$authgrid = array();
if ($userid == 0 || $maingrp == 0) {
$groups[] = 1;
} else {
$groups[] = $maingrp;
$sql = Cot::$db->query("SELECT gru_groupid FROM $db_groups_users WHERE gru_userid=$userid");
while ($row = $sql->fetch()) {
$groups[] = $row['gru_groupid'];
}
$sql->closeCursor();
}
$sql_groups = implode(',', $groups);
$sql = Cot::$db->query("SELECT auth_code, auth_option, auth_rights FROM $db_auth WHERE auth_groupid IN " .
"(".$sql_groups.") ORDER BY auth_code ASC, auth_option ASC");
while ($row = $sql->fetch()) {
if (!isset($authgrid[$row['auth_code']][$row['auth_option']])) {
$authgrid[$row['auth_code']][$row['auth_option']] = 0;
}
// Bitwise OR. We take the most maximum rights that the user groups (roles) give
$authgrid[$row['auth_code']][$row['auth_option']] |= $row['auth_rights'];
}
$sql->closeCursor();
return $authgrid;
}
Описание функции:
Функция cot_auth_build принимает ID пользователя и его основную группу, затем строит массив с правами доступа, которые пользователь получает от всех своих групп.
Параметры функции:
$userid (int): ID пользователя.
$maingrp (int): Основная группа пользователя.
Возвращаемое значение:
Возвращает массив $authgrid, где ключи — это области и опции доступа, а значения — битовые маски прав доступа.
Логика работы функции:
Инициализация групп:
Если ID пользователя или ID основной группы равны нулю, функция предполагает, что пользователь — гость, и добавляет его в группу гостей (ID группы — 1).
if ($userid == 0 || $maingrp == 0) {
$groups[] = 1;
} else {
$groups[] = $maingrp;
// Получаем дополнительные группы пользователя
}
Получение групп пользователя: Если пользователь имеет дополнительные группы, они добавляются в массив $groups.
$sql = Cot::$db->query("SELECT gru_groupid FROM $db_groups_users WHERE gru_userid=$userid");
while ($row = $sql->fetch()) {
$groups[] = $row['gru_groupid'];
}
Получение прав доступа: Все права доступа, назначенные группам пользователя, извлекаются из таблицы auth базы данных.
$sql = Cot::$db->query("SELECT auth_code, auth_option, auth_rights FROM $db_auth WHERE auth_groupid IN " .
"(".$sql_groups.") ORDER BY auth_code ASC, auth_option ASC");
Построение таблицы прав:
Для каждой записи из таблицы auth выполняется побитовое ИЛИ (|=) с правами, чтобы объединить права всех групп пользователя. Это гарантирует, что пользователь получит максимальные права, предоставляемые любыми его группами.
while ($row = $sql->fetch()) {
if (!isset($authgrid[$row['auth_code']][$row['auth_option']])) {
$authgrid[$row['auth_code']][$row['auth_option']] = 0;
}
$authgrid[$row['auth_code']][$row['auth_option']] |= $row['auth_rights'];
}
Возврат результата:
В конце функция возвращает массив $authgrid, содержащий права доступа пользователя.
return $authgrid;
Пример использования:
Если нужно построить таблицу прав доступа для пользователя с ID 123 и основной группой 5:
$acl = cot_auth_build(123, 5);
Теперь $acl будет содержать все права доступа для пользователя, агрегированные из всех его групп.
Заключение:
Функция cot_auth_build — ключевая часть системы управления доступом Cotonti. Она эффективно объединяет права доступа из всех групп, к которым принадлежит пользователь, и возвращает их в виде таблицы, что позволяет быстро проверять доступ пользователя к различным ресурсам.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 19:38
- Последнее обновление: 21.01.2025 19:38