Функция cot_authCategories в Cotonti

Разберем функцию cot_authCategories(), которая используется для получения прав доступа к категориям в определенной области (или расширении) Cotonti, что полезно при формировании запросов к базе данных.

Код функции:

/**
 * Returns access permissions for categories
 * Useful in DB queries
 *
 * @param string $area Cotonti area or extension code
 * @param string $mask Access mask
 *
 * @param string $accessMask Access mask
 * @return array<string, bool|string[]>
 */
function cot_authCategories($area, $accessMask = 'RA')
{
    static $cache = [];

    $cacheKey = $area . '-' . $accessMask;
    if (isset($cache[$cacheKey])) {
        return $cache[$cacheKey];
    }

    $masks = str_split($accessMask);
    if (empty($masks)) {
        $masks = ['R', 'A'];
    }

    $maskMap = ['R' => 'read', 'A' => 'admin', 'W' => 'write'];

    $result = [];
    foreach ($masks as $mask) {
        $key = isset($maskMap[$mask]) ? $maskMap[$mask] : $mask;
        $result[$key . 'All'] = false;
        $result[$key] = [];
        $result[$key . 'NotAllowedAll'] = false;
        $result[$key . 'NotAllowed'] = [];
    }

    if (empty(Cot::$structure[$area])) {
        return $result;
    }

    foreach ($masks as $mask) {
        $key = isset($maskMap[$mask]) ? $maskMap[$mask] : $mask;
        $result[$key . 'All'] = true;
        $result[$key . 'NotAllowedAll'] = true;
    }

    foreach (Cot::$structure[$area] as $code => $cat) {
        $code = (string) $code;
        if (in_array($code, ['all', '']) || empty($cat)) {
            continue;
        }

        foreach ($masks as $mask) {
            $key = isset($maskMap[$mask]) ? $maskMap[$mask] : $mask;

            if (cot_auth($area, $code, $mask)) {
                $result[$key][] = $code;
                $result[$key . 'NotAllowedAll'] = false;
            } else {
                $result[$key . 'NotAllowed'][] = $code;
                $result[$key . 'All'] = false;
            }
        }
    }

    $cache[$cacheKey] = $result;

    return $result;
}


Описание функции:

Эта функция проверяет права доступа пользователя к категориям в указанной области ($area) и возвращает массив, содержащий категории, к которым у пользователя есть или нет доступа, в зависимости от предоставленной маски доступа ($accessMask).


Параметры функции:

$area (string): Код области или расширения (например, page, forums и т. д.).
$accessMask (string): Маска доступа, определяющая права, которые необходимо проверить. По умолчанию это 'RA', что означает проверку прав на чтение и администрирование.

Возвращаемое значение:
Возвращает массив, который содержит информацию о доступных и недоступных категориях для каждого права из маски.

Логика работы функции:

Кэширование:


Функция использует статический массив $cache для хранения результатов предыдущих вызовов, чтобы избежать повторных вычислений для одинаковых входных данных.

static $cache = [];

 

Если для заданных $area и $accessMask результат уже закэширован, он возвращается сразу:

if (isset($cache[$cacheKey])) {
    return $cache[$cacheKey];
}


 

Подготовка маски доступа: Маска доступа разбивается на отдельные символы с помощью str_split(). Если маска пуста, то по умолчанию устанавливается проверка на чтение и администрирование ('RA').

Карта масок:

Создается карта масок, которая преобразует символы маски (R, A, W) в человеко-понятные ключи (read, admin, write).

$maskMap = ['R' => 'read', 'A' => 'admin', 'W' => 'write'];


Инициализация результата: Создается массив $result, который содержит ключи для каждой из проверяемых масок, а также дополнительные ключи для хранения информации о категориях, к которым пользователь не имеет доступа.


$result = [];
foreach ($masks as $mask) {
    $key = isset($maskMap[$mask]) ? $maskMap[$mask] : $mask;
    $result[$key . 'All'] = false;
    $result[$key] = [];
    $result[$key . 'NotAllowedAll'] = false;
    $result[$key . 'NotAllowed'] = [];
}

 

Проверка структуры:

Если структура для данной области пуста, функция возвращает пустой результат.

Установка всех прав:

Для каждой маски функции сначала предполагают, что у пользователя есть доступ ко всем категориям, и затем это утверждение проверяется:


foreach ($masks as $mask) {
    $key = isset($maskMap[$mask]) ? $maskMap[$mask] : $mask;
    $result[$key . 'All'] = true;
    $result[$key . 'NotAllowedAll'] = true;
}


Проверка доступа к категориям:
Функция проходит по каждой категории в структуре области и проверяет доступ пользователя к каждой из них для каждого права, указанного в маске.

foreach (Cot::$structure[$area] as $code => $cat) {
    // Проверка доступа с использованием cot_auth
    if (cot_auth($area, $code, $mask)) {
        $result[$key][] = $code;
        $result[$key . 'NotAllowedAll'] = false;
    } else {
        $result[$key . 'NotAllowed'][] = $code;
        $result[$key . 'All'] = false;
    }
}


Кэширование результата: После выполнения всех проверок результат сохраняется в кэш для дальнейшего использования:


 

$cache[$cacheKey] = $result;


Возвращение результата:
Функция возвращает массив $result, который содержит списки доступных и недоступных категорий для каждого права из маски.

Пример использования:

Предположим, вы хотите получить список всех категорий, к которым пользователь имеет доступ на чтение и администрирование в области forums:


 

$authCategories = cot_authCategories('forums');


Результат будет выглядеть следующим образом:


 

Array
(
    [readAll] => true
    [read] => Array
        (
            [0] => cat1
            [1] => cat2
            // Другие категории с правом на чтение
        )
    [readNotAllowedAll] => false
    [readNotAllowed] => Array
        (
            // Категории, к которым нет доступа на чтение
        )
    [adminAll] => false
    [admin] => Array
        (
            // Категории с правом на администрирование
        )
    [adminNotAllowedAll] => true
    [adminNotAllowed] => Array
        (
            // Категории, к которым нет доступа на администрирование
        )
)


Заключение:

Функция cot_authCategories предоставляет удобный способ проверки прав доступа пользователя к категориям в указанной области, что особенно полезно при создании сложных запросов к базе данных.
Она эффективно кэширует результаты для улучшения производительности и уменьшения нагрузки на систему.

4 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Article multicategories

Additional categories where this article is shown as similar.

Content author

Administrator

Offline

Administrator

Last logged: 2026-09-13 14:50

  • Page published: 2025-01-21 19:30
  • Last update: 2025-01-21 19:33