Функция 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 и важна для настройки безопасности и управления правами пользователей.

5 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 21.01.2025 19:24
  • Последнее обновление: 21.01.2025 19:24

Похожие страницы

Проверка прав пользователей "cot_auth()" в шаблонах Cotonti
1 Примеры использования cot_auth() в шаблонах Cotonti с разными масками прав (R, W, A, etc.) и с категориями тоже. Как