Функция 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 минут чтения Administrator

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

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

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

Administrator

Оффлайн

Administrator

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

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