Функция 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 предоставляет удобный способ проверки прав доступа пользователя к категориям в указанной области, что особенно полезно при создании сложных запросов к базе данных.
Она эффективно кэширует результаты для улучшения производительности и уменьшения нагрузки на систему.
Comments (0)
Content author
Offline
Administrator
Last logged: 2026-07-05 18:32
- Page published: 2025-01-21 19:30
- Last update: 2025-01-21 19:33