Функция cot_auth в Cotonti
Разберем функцию cot_auth(), которая в фреймворке Cotonti используется для проверки прав доступа пользователя к различным областям сайта, категориям и операциям.
Код функции
/*
* ================================= User and Authorization Subsystem ==================================
*/
/**
* Returns specific access permissions
*
* @param string $area Cotonti area or extension code
* @param ?string $option Option to access.
* Empty - check if user has access to area (extension)
* 'any' - if user has access to the extension or to any of its categories
* category code - if user has access to this category of area (extension)
* @param string $mask Access mask
* @return bool|array<string, bool>
*/
function cot_auth($area, $option = null, $mask = 'RWA')
{
$mn['R'] = 1;
$mn['W'] = 2;
$mn['1'] = 4;
$mn['2'] = 8;
$mn['3'] = 16;
$mn['4'] = 32;
$mn['5'] = 64;
$mn['A'] = 128;
$masks = str_split($mask);
$res = [];
if ($option === null || $option == '') {
$option = 'a';
}
foreach ($masks as $k => $ml) {
$logOption = $area . '.' . $option . '.' . $ml;
if (empty($mn[$ml])) {
Cot::$sys['auth_log'][] = $logOption . '=0';
$res[] = false;
} elseif ($option == 'any') {
$cnt = 0;
if (isset(Cot::$usr['auth']) && is_array(Cot::$usr['auth'])) {
if (isset(Cot::$usr['auth'][$area]) && is_array(Cot::$usr['auth'][$area])) {
foreach (Cot::$usr['auth'][$area] as $k => $g) {
$cnt += (($g & $mn[$ml]) == $mn[$ml]);
}
}
$cnt = ($cnt == 0 && Cot::$usr['auth']['admin']['a'] && $ml == 'A') ? 1 : $cnt;
}
Cot::$sys['auth_log'][] = ($cnt > 0) ? $logOption . '=1' : $logOption . '=0';
$res[] = ($cnt > 0);
} else {
$tmpOption = 0;
if (isset(Cot::$usr['auth'][$area][$option])) {
$tmpOption = Cot::$usr['auth'][$area][$option];
}
Cot::$sys['auth_log'][] = (($tmpOption & $mn[$ml]) == $mn[$ml]) ? $logOption . '=1' : $logOption . '=0';
$res[] = (($tmpOption & $mn[$ml]) == $mn[$ml]);
}
}
return (count($res) == 1) ? $res[0] : $res;
}
Описание:
Эта функция проверяет права доступа пользователя к области (или расширению) сайта, к конкретной категории внутри этой области, а также к определенным операциям в зависимости от предоставленного маска.
Параметры функции:
$area (string): Код области или расширения (например, page, forums и т. д.).
$option (string|null):
Если пусто, то проверяется доступ пользователя ко всей области.
Если указано 'any', проверяется доступ ко всем категориям в рамках расширения.
Если указана категория (например, 'cat1'), проверяется доступ к этой конкретной категории в области.
$mask (string): Строка, содержащая типы прав доступа, которые проверяются.
Основные значения:
'R': Read (Чтение)
'W': Write (Запись)
'A': Admin (Администрирование)
Другие типы прав, которые могут быть указаны в маске (например, '1', '2', '3' и т. д.).
Функция возвращает bool или array с результатами проверки прав для каждого из символов в маске.
Логика работы:
Массив прав доступа:
В начале функции создается массив $mn, который связывает символы прав с их числовыми значениями:
$mn['R'] = 1;
$mn['W'] = 2;
$mn['1'] = 4;
$mn['2'] = 8;
$mn['3'] = 16;
$mn['4'] = 32;
$mn['5'] = 64;
$mn['A'] = 128;
Это значения, которые будут использоваться для побитовой проверки прав доступа.
Обработка маски:
Маска прав разбивается на отдельные символы:
$masks = str_split($mask);
Каждый символ в маске соответствует одному праву доступа (например, 'R', 'W' и т. д.).
Проверка доступа:
Если $option не указано или пустое, то предполагается, что проверяется доступ ко всей области или расширению.
Если $option равно 'any', то функция проверяет, имеет ли пользователь доступ хотя бы к одной категории области или расширения.
В других случаях проверяется доступ к конкретной категории в указанной области.
Проверка прав в массиве
Cot::$usr['auth']:
Для каждого из прав в маске:
Права any проверяются для всех категорий, если пользователь имеет доступ хотя бы к одной из них (по маске доступа).
Права для конкретной категории проверяются для заданной категории и области.
Пример проверки:
if (isset(Cot::$usr['auth'][$area][$option])) {
$tmpOption = Cot::$usr['auth'][$area][$option];
}
Затем проверяется, соответствует ли право пользователя маске:
(($tmpOption & $mn[$ml]) == $mn[$ml]) Логирование проверок: В процессе работы функции ведется логирование всех проверок прав доступа в массив Cot::$sys['auth_log'].
Примеры работы функции:
Проверка доступа к области: Если передано только имя области:
cot_auth('page');
Функция проверит, есть ли у пользователя доступ ко всей области page.
Проверка доступа к категории: Если передано имя области и категории:
cot_auth('page', 'cat1');
Функция проверит, есть ли у пользователя доступ к категории cat1 в области page.
Проверка доступа к правам (например, только на чтение): Если передано имя области, категории и маска прав:
cot_auth('forums', 'any', 'R');
Функция проверит, есть ли у пользователя право на чтение (R) хотя бы в одной категории области forums.
Проверка доступа для всех прав (RWA): Функция проверит доступ на чтение, запись и администрирование:
cot_auth('page', 'cat1', 'RWA');
Возвращаемое значение:
Функция возвращает:
bool, если проверяется только одно право (например, 'R' или 'A').
array, если проверяется несколько прав (например, 'RWA'), в котором каждый элемент массива соответствует результату проверки каждого из прав в маске.
Пример:
$res = cot_auth('forums', 'cat1', 'RWA');
Возвращаемое значение:
$res = [true, true, false]; // например, у пользователя есть доступ на чтение и запись, но нет прав на администрирование.
Заключение:
Функция cot_auth гибко проверяет права доступа для различных областей, категорий и операций на основе предоставленной маски прав. Она используется для реализации системы контроля доступа в фреймворке Cotonti и важна для настройки безопасности и управления правами пользователей.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 19:24
- Последнее обновление: 21.01.2025 19:24