Файл auth.php в Cotonti
Этот файл в основном управляет правами доступа и группами пользователей через механизмы авторизации и контроля доступа (ACL).
Мы завершили анализ кода файла auth.php в фреймворке Cotonti. Этот файл в основном управляет правами доступа и группами пользователей через механизмы авторизации и контроля доступа (ACL). Вот основные моменты, которые мы рассмотрели:
-
Управление правами доступа: В файле описаны функции, которые работают с правами групп, таких как чтение (R), запись (W), а также другие специфические разрешения (например, 1, 2, 3, 4, 5, A — для более детализированных настроек).
-
Основные функции:
- Добавление и удаление групп: Например, функции
cot_auth_add_groupиcot_auth_remove_groupуправляют добавлением и удалением групп из таблицыauth. - Управление объектами в ACL: Функции
cot_auth_add_itemиcot_auth_remove_itemпозволяют добавлять или удалять объекты из системы контроля доступа, определяя разрешения для разных групп. - Чистка кэша: Функция
cot_auth_clearочищает кэш прав пользователей. - Реорганизация таблицы:
cot_auth_reorderсортирует строки в таблицеauth, обеспечивая правильный порядок данных.
- Добавление и удаление групп: Например, функции
-
Работа с правами:
- Использование битовых масок для представления и обработки прав доступа. Например, функции
cot_auth_getmaskиcot_auth_getvalueпреобразуют права в маски и обратно. - Преобразования позволяют удобно работать с правами на уровне строк таблицы базы данных, которые хранят битовые значения для доступа.
- Использование битовых масок для представления и обработки прав доступа. Например, функции
-
Гибкость и настройки:
- В коде есть возможность задавать права по умолчанию через массивы, такие как
$cot_auth_default_permitи$cot_auth_default_lock, а также возможность их перекрывать в пользовательских настройках.
- В коде есть возможность задавать права по умолчанию через массивы, такие как
В целом, этот файл является ядром системы авторизации в Cotonti, обеспечивая гибкость в управлении правами доступа и группами пользователей. Функции, которые мы рассмотрели, позволяют добавлять, удалять, изменять права и организовывать доступ на уровне групп и объектов системы.
/**
* Authorization Management API
* Основные функции авторизации находятся в файле functions.php
*
* @package API - Authorization
* @copyright (c) Cotonti Team
* @license https://github.com/Cotonti/Cotonti/blob/master/License.txt
*/
defined('COT_CODE') or die('Неверный URL'); // Проверка, что код выполняется в рамках системы Cotonti, иначе завершение выполнения с ошибкой.
$cot_auth_default_permit = array( // Создание массива с правами доступа по умолчанию.
COT_GROUP_DEFAULT => 'RW', // Группа по умолчанию имеет права на чтение и запись.
COT_GROUP_GUESTS => 'R', // Гости имеют только права на чтение.
COT_GROUP_INACTIVE => 'R', // Неактивные пользователи имеют только права на чтение.
COT_GROUP_BANNED => '0', // Заблокированные пользователи не имеют прав.
COT_GROUP_MEMBERS => 'RW', // Члены группы имеют права на чтение и запись.
COT_GROUP_SUPERADMINS => 'RW12345A' // Суперадмины имеют полный доступ с правами на чтение, запись и дополнительные права.
);
$cot_auth_default_lock = array( // Создание массива с заблокированными (ограниченными) правами по умолчанию.
COT_GROUP_DEFAULT => '0', // Группа по умолчанию не имеет доступ.
COT_GROUP_GUESTS => 'A', // Гости имеют ограниченные права (A - ограничение).
COT_GROUP_INACTIVE => 'A', // Неактивные пользователи имеют ограниченные права (A).
COT_GROUP_BANNED => 'RW12345A', // Заблокированные пользователи имеют те же права, что и суперадмины.
COT_GROUP_MEMBERS => '0', // Члены группы не имеют доступа.
COT_GROUP_SUPERADMINS => 'RW12345A' // Суперадмины имеют полный доступ с правами на чтение, запись и дополнительные права.
);
/**
* Регистрирует группу пользователей в таблице auth
*
* @param int $group_id Идентификатор группы
* @param int $base_group_id Идентификатор группы, из которой копируются права
* @return bool Статус выполнения операции
* @global CotDB $db
*/
function cot_auth_add_group($group_id, $base_group_id = COT_GROUP_MEMBERS) // Функция для добавления группы в таблицу auth
{
global $db, $db_auth, $usr; // Подключение глобальных переменных базы данных, таблицы и текущего пользователя
if ($group_id <= COT_GROUP_SUPERADMINS) // Если ID группы меньше или равен ID супер-администраторов
{
return false; // Возвращаем false, если группа не может быть добавлена (не позволяет добавлять супер-администраторов)
}
if ($base_group_id <= 0) // Если ID базовой группы меньше или равен нулю
{
$base_group_id = COT_GROUP_MEMBERS; // Используем группу участников по умолчанию как базовую группу
}
$db->query("INSERT INTO $db_auth (auth_groupid, auth_code, auth_option, auth_rights, auth_rights_lock, auth_setbyuserid) // Выполняем запрос на добавление новых прав в таблицу auth
SELECT $group_id, auth_code, auth_option, auth_rights, auth_rights_lock, {$usr['id']} // Копируем права из базовой группы для новой группы с добавлением ID текущего пользователя
FROM $db_auth WHERE auth_groupid = $base_group_id"); // Извлекаем данные из таблицы auth для базовой группы
cot_auth_reorder(); // Вызываем функцию для перераспределения прав, если нужно
return true; // Возвращаем true, чтобы показать, что группа была успешно добавлена
}
/**
* Добавляет новый объект в списки контроля доступа
*
* Пример использования:
* <code>
* $auth_permit = array(
* COT_GROUP_DEFAULT => 'R', // разрешение на чтение для группы по умолчанию
* COT_GROUP_GUESTS => '0', // запрещено для гостей
* COT_GROUP_MEMBERS => 'R', // разрешение на чтение для членов
* 12 => 'RW', // разрешает чтение и запись для группы с ID = 12
* );
*
* $auth_lock = array(
* COT_GROUP_DEFAULT => 'A', // блокировка всех прав для группы по умолчанию
* COT_GROUP_GUESTS => 'W12345A', // блокировка некоторых прав для гостей
* COT_GROUP_MEMBERS => 'A', // блокировка всех прав для членов
* 12 => 'R', // невозможно изменить право на чтение для группы с ID = 12
* );
*
* cot_auth_add_item('test', 'item123', $auth_permit, $auth_lock);
* </code>
*
* @param string $module_name Имя модуля, к которому относится объект
* @param string $item_id Идентификатор объекта в рамках модуля
* @param array $auth_permit Карта разрешённых прав
* @param array $auth_lock Карта заблокированных прав
* @return int Количество вставленных строк
* @global CotDB $db
*/
function cot_auth_add_item($module_name, $item_id, $auth_permit = [], $auth_lock = [])
{
global $cot_groups, $cot_auth_default_permit, $cot_auth_default_lock;
$auth_permit = $auth_permit + $cot_auth_default_permit; // Объединение разрешений с значениями по умолчанию
$auth_lock = $auth_lock + $cot_auth_default_lock; // Объединение заблокированных прав с значениями по умолчанию
$ins_array = []; // Инициализация массива для вставки
foreach ($cot_groups as $k => $v) {
if (empty($v['skiprights'])) { // Пропуск групп с флагом пропуска прав
$base_grp = $k > COT_GROUP_SUPERADMINS ? COT_GROUP_DEFAULT : $k; // Выбор группы для базовых прав
$ins_array[] = array( // Заполнение массива для вставки
'auth_groupid' => $k, // ID группы
'auth_code' => $module_name, // Код модуля
'auth_option' => $item_id, // Идентификатор объекта
'auth_rights' => cot_auth_getvalue($auth_permit[$base_grp]), // Получение прав для группы
'auth_rights_lock' => cot_auth_getvalue($auth_lock[$base_grp]), // Получение заблокированных прав для группы
'auth_setbyuserid' => Cot::$usr['id'] // ID пользователя, который установил права
);
}
}
$res = 0; // Инициализация переменной для результата
if (!empty($ins_array)) { // Если массив для вставки не пуст
$res = Cot::$db->insert(Cot::$db->auth, $ins_array); // Выполнение вставки в базу данных
}
cot_auth_reorder(); // Перестроение списка прав доступа
cot_auth_clear('all'); // Очистка кеша прав
return $res; // Возвращение количества вставленных строк
}
/**
* Возвращает наивысший уровень всех групп, в которых состоит пользователь.
*
* @param int $userid ID пользователя
* @param bool $maingroup Возвращать уровень основной группы
* @return int
*
* @deprecated Не используется нигде. Похоже, устаревшая механика уровней пользователей
*/
function cot_auth_getlevel($userid, $maingroup = false)
{
global $db, $db_groups, $db_groups_users, $db_users;
if ($maingroup) // Если нужно вернуть уровень основной группы
{
return (int)$db->query("
SELECT grp_level FROM $db_groups
INNER JOIN $db_users
ON user_maingrp = grp_id
WHERE user_id = ?
", array($userid))->fetchColumn(); // Получаем уровень основной группы пользователя
}
else
{
return (int)$db->query("
SELECT MAX(grp_level) FROM $db_groups
WHERE grp_id IN (
SELECT gru_groupid
FROM $db_groups_users
WHERE gru_userid = ?
)
", array($userid))->fetchColumn(); // Получаем наивысший уровень из всех групп, в которых состоит пользователь
}
}
/**
* Возвращает маску доступа для заданного байта доступа
*
* @param int $rn Байтовое представление прав
* @return string
*/
function cot_auth_getmask($rn)
{
$res = ($rn & 1) ? 'R' : ''; // Если младший бит равен 1, добавляем 'R' (Read)
$res .= (($rn & 2) == 2) ? 'W' : ''; // Если второй бит равен 1, добавляем 'W' (Write)
$res .= (($rn & 4) == 4) ? '1' : ''; // Если третий бит равен 1, добавляем '1'
$res .= (($rn & 8) == 8) ? '2' : ''; // Если четвёртый бит равен 1, добавляем '2'
$res .= (($rn & 16) == 16) ? '3' : ''; // Если пятый бит равен 1, добавляем '3'
$res .= (($rn & 32) == 32) ? '4' : ''; // Если шестой бит равен 1, добавляем '4'
$res .= (($rn & 64) == 64) ? '5' : ''; // Если седьмой бит равен 1, добавляем '5'
$res .= (($rn & 128) == 128) ? 'A' : ''; // Если восьмой бит равен 1, добавляем 'A' (Access)
return $res; // Возвращаем строку маски доступа
}
/**
* Преобразует маску доступа в байт прав
*
* @param string $mask Маска доступа, например, 'RW1A'
* @return int
*/
function cot_auth_getvalue($mask)
{
$mn['0'] = 0; // Присваиваем значение 0 для '0'
$mn['R'] = 1; // Присваиваем значение 1 для 'R'
$mn['W'] = 2; // Присваиваем значение 2 для 'W'
$mn['1'] = 4; // Присваиваем значение 4 для '1'
$mn['2'] = 8; // Присваиваем значение 8 для '2'
$mn['3'] = 16; // Присваиваем значение 16 для '3'
$mn['4'] = 32; // Присваиваем значение 32 для '4'
$mn['5'] = 64; // Присваиваем значение 64 для '5'
$mn['A'] = 128; // Присваиваем значение 128 для 'A'
$res = 0; // Инициализация переменной для хранения результата
$masks = str_split($mask); // Разделяем строку маски на отдельные символы
foreach ($masks as $k) { // Перебираем каждый символ маски
if(isset($mn[$k])) $res += $mn[$k]; // Если символ найден в массиве $mn, добавляем его значение к результату
}
return $res; // Возвращаем итоговое байтовое представление прав
}
/**
* Удаляет группу пользователей из таблицы auth
*
* @param int $group_id Идентификатор группы
* @return int Количество удалённых записей
* @global CotDB $db
*/
function cot_auth_remove_group($group_id)
{
global $db, $db_auth;
$db->delete($db_auth, 'auth_groupid=' . (int)$group_id); // Удаляем все записи из таблицы auth, где идентификатор группы равен $group_id
return $db->affectedRows; // Возвращаем количество удалённых записей
}
/**
* Удаляет объект из списка контроля доступа (ACL)
*
* @param string $module_name Модуль, к которому принадлежит объект
* @param string $item_id Идентификатор объекта в модуле. Если не указан, удаляются все объекты.
* @return int Количество удалённых записей
* @global CotDB $db
*/
function cot_auth_remove_item($module_name, $item_id = null)
{
global $db, $db_auth;
$opt = is_null($item_id) ? '' : 'AND auth_option=' . $db->quote($item_id); // Если $item_id не задан, то условие пустое, иначе фильтруем по идентификатору объекта
$db->delete($db_auth, "auth_code='$module_name' $opt"); // Удаляем записи из таблицы auth, соответствующие указанному модулю и объекту (если $item_id задан)
return $db->affectedRows; // Возвращаем количество удалённых записей
}
/**
* Оптимизирует таблицу auth, сортируя её строки
* @global CotDB $db
*/
function cot_auth_reorder()
{
global $db, $db_auth;
$sql = $db->query("ALTER TABLE $db_auth ORDER BY auth_code ASC, auth_option ASC, auth_groupid ASC, auth_code ASC"); // Выполняем SQL-запрос для сортировки строк таблицы auth по столбцам auth_code, auth_option, auth_groupid
}
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 24.01.2025 12:06
- Последнее обновление: 24.01.2025 12:10