Функция 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

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:38
  • Last update: 2025-01-21 19:38