Функция cot_auth_build в Cotonti

Функция cot_auth_build используется для построения таблицы прав доступа (Access Control List, ACL) для конкретного пользователя на основе его основной группы и дополнительных групп, в которых он состоит.

Код функции

/**
 * Builds Access Control List (ACL) for a specific user
 *
 * @param int $userid User ID
 * @param int $maingrp User main group
 * @return array
 * @global CotDB $db
 */
function cot_auth_build($userid, $maingrp = 0)
{
    global $db, $db_auth, $db_groups_users;

    $groups = array();
    $authgrid = array();

    if ($userid == 0 || $maingrp == 0) {
        $groups[] = 1;

    } else {
        $groups[] = $maingrp;
        $sql = Cot::$db->query("SELECT gru_groupid FROM $db_groups_users WHERE gru_userid=$userid");

        while ($row = $sql->fetch()) {
            $groups[] = $row['gru_groupid'];
        }
        $sql->closeCursor();
    }

    $sql_groups = implode(',', $groups);

    $sql = Cot::$db->query("SELECT auth_code, auth_option, auth_rights FROM $db_auth WHERE auth_groupid IN " .
        "(".$sql_groups.") ORDER BY auth_code ASC, auth_option ASC");

    while ($row = $sql->fetch()) {
        if (!isset($authgrid[$row['auth_code']][$row['auth_option']])) {
            $authgrid[$row['auth_code']][$row['auth_option']] = 0;
        }

        // Bitwise OR. We take the most maximum rights that the user groups (roles) give
        $authgrid[$row['auth_code']][$row['auth_option']] |= $row['auth_rights'];
    }
    $sql->closeCursor();

    return $authgrid;
}

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

Функция cot_auth_build принимает ID пользователя и его основную группу, затем строит массив с правами доступа, которые пользователь получает от всех своих групп.

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

$userid (int): ID пользователя.
$maingrp (int): Основная группа пользователя.


Возвращаемое значение:
Возвращает массив $authgrid, где ключи — это области и опции доступа, а значения — битовые маски прав доступа.

Логика работы функции:
Инициализация групп:
Если ID пользователя или ID основной группы равны нулю, функция предполагает, что пользователь — гость, и добавляет его в группу гостей (ID группы — 1).

 

if ($userid == 0 || $maingrp == 0) {
    $groups[] = 1;
} else {
    $groups[] = $maingrp;
    // Получаем дополнительные группы пользователя
}


Получение групп пользователя: Если пользователь имеет дополнительные группы, они добавляются в массив $groups.


$sql = Cot::$db->query("SELECT gru_groupid FROM $db_groups_users WHERE gru_userid=$userid");
while ($row = $sql->fetch()) {
    $groups[] = $row['gru_groupid'];
}


Получение прав доступа: Все права доступа, назначенные группам пользователя, извлекаются из таблицы auth базы данных.


$sql = Cot::$db->query("SELECT auth_code, auth_option, auth_rights FROM $db_auth WHERE auth_groupid IN " .
    "(".$sql_groups.") ORDER BY auth_code ASC, auth_option ASC");
    
    
Построение таблицы прав:
Для каждой записи из таблицы auth выполняется побитовое ИЛИ (|=) с правами, чтобы объединить права всех групп пользователя. Это гарантирует, что пользователь получит максимальные права, предоставляемые любыми его группами.


while ($row = $sql->fetch()) {
    if (!isset($authgrid[$row['auth_code']][$row['auth_option']])) {
        $authgrid[$row['auth_code']][$row['auth_option']] = 0;
    }
    $authgrid[$row['auth_code']][$row['auth_option']] |= $row['auth_rights'];
}

Возврат результата:
В конце функция возвращает массив $authgrid, содержащий права доступа пользователя.


return $authgrid;

Пример использования:
Если нужно построить таблицу прав доступа для пользователя с ID 123 и основной группой 5:

$acl = cot_auth_build(123, 5);

Теперь $acl будет содержать все права доступа для пользователя, агрегированные из всех его групп.

Заключение:
Функция cot_auth_build — ключевая часть системы управления доступом Cotonti. Она эффективно объединяет права доступа из всех групп, к которым принадлежит пользователь, и возвращает их в виде таблицы, что позволяет быстро проверять доступ пользователя к различным ресурсам.

3 minutes read Administrator

Comments (0)

No comments yet
Only registered users can post new comments

Content author

Administrator

Offline

Administrator

Last logged: 2026-07-05 18:32

  • Page published: 2025-01-21 19:38
  • Last update: 2025-01-21 19:38