За последние 24 часа нас посетили 55050 программистов и 1725 роботов. Сейчас ищет 971 программист ...

A Better Login System - Система разграничения прав

Тема в разделе "PHP для новичков", создана пользователем ALEXU, 27 фев 2012.

  1. ALEXU

    ALEXU Активный пользователь

    С нами с:
    5 апр 2011
    Сообщения:
    79
    Симпатии:
    0
    Адрес:
    Russia
    Доброго времени суток.

    Никак не могу понять, как можно оптимизировать это все.
    Взял __http://net.tutsplus.com/tutorials/php/a-better-login-system/
    Очень удобна штука, делает то, что нужно и в удобной форме. Можно разграничивать права как по группам, так и индивидуально.
    Но делается куча запросов. Доходит до 25. Это уже ужас просто.

    Что именно делает запросы, я нашел, но как переделать - не знаю.
    В конструкторе вызывается метод buildACL(),
    а в нем есть $this->getRolePerms($this->userRoles)
    и $this->getUserPerms($this->userID)

    Оба этих метода делают запросы в БД и обрабатывают результат в цикле и имееют там такую строку
    Код (Text):
    1. $pK = strtolower($this->getPermKeyFromID($row['permID']));
    Получается, что getPermKeyFromID() все время делает кучу запросов.
    Пробовал переписать запросы, но результата нет.

    Права проверяются так
    Код (Text):
    1. $myACL = new ACL();
    2. if ($myACL->hasPermission('access_admin') != true)// access_admin - группа, которой разрешен доступ на страницу
    3. {
    4.         header("location: /");
    5. }
    Сам класс
    Код (Text):
    1. <?php
    2.  
    3. class ACL
    4. {
    5.     var $perms = array();       //Array : Stores the permissions for the user
    6.     var $userID = 0;            //Integer : Stores the ID of the current user
    7.     var $userRoles = array();   //Array : Stores the roles of the current user
    8.     function __constructor($userID = '')
    9.     {
    10.         if ($userID != '')
    11.         {
    12.             $this->userID = floatval($userID);
    13.         } else {
    14.             $this->userID = floatval($_SESSION['userID']);
    15.         }
    16.         $this->userRoles = $this->getUserRoles('ids');
    17.         $this->buildACL();
    18.     }
    19.     function ACL($userID = '')
    20.     {
    21.         $this->__constructor($userID);
    22.         //crutch for PHP4 setups
    23.     }
    24.    
    25.     function buildACL()
    26.     {
    27.         //first, get the rules for the user's role
    28.         if (count($this->userRoles) > 0)
    29.         {
    30.             $this->perms = array_merge($this->perms,$this->getRolePerms($this->userRoles));
    31.         }
    32.         //then, get the individual user permissions
    33.         $this->perms = array_merge($this->perms,$this->getUserPerms($this->userID));
    34.     }
    35.    
    36.     function getPermKeyFromID($permID)
    37.     {
    38.         $strSQL = "SELECT `permKey` FROM `permissions` WHERE `ID` = " . floatval($permID) . " LIMIT 1";
    39.         $data = mysql_query($strSQL);
    40.         $row = mysql_fetch_array($data);
    41.         return $row[0];
    42.     }
    43.    
    44.     function getPermNameFromID($permID)
    45.     {
    46.         $strSQL = "SELECT `permName` FROM `permissions` WHERE `ID` = " . floatval($permID) . " LIMIT 1";
    47.         $data = mysql_query($strSQL);
    48.         $row = mysql_fetch_array($data);
    49.         return $row[0];
    50.     }
    51.    
    52.     function getRoleNameFromID($roleID)
    53.     {
    54.         $strSQL = "SELECT `roleName` FROM `roles` WHERE `ID` = " . floatval($roleID) . " LIMIT 1";
    55.         $data = mysql_query($strSQL);
    56.         $row = mysql_fetch_array($data);
    57.         return $row[0];
    58.     }
    59.    
    60.     function getUserRoles()
    61.     {
    62.         $strSQL = "SELECT * FROM `user_roles` WHERE `userID` = " . floatval($this->userID) . " ORDER BY `addDate` ASC";
    63.         $data = mysql_query($strSQL);
    64.         $resp = array();
    65.         while($row = mysql_fetch_array($data))
    66.         {
    67.             $resp[] = $row['roleID'];
    68.         }
    69.         return $resp;
    70.     }
    71.    
    72.     function getAllRoles($format='ids')
    73.     {
    74.         $format = strtolower($format);
    75.         $strSQL = "SELECT * FROM `roles` ORDER BY `roleName` ASC";
    76.         $data = mysql_query($strSQL);
    77.         $resp = array();
    78.         while($row = mysql_fetch_array($data))
    79.         {
    80.             if ($format == 'full')
    81.             {
    82.                 $resp[] = array("ID" => $row['ID'],"Name" => $row['roleName']);
    83.             } else {
    84.                 $resp[] = $row['ID'];
    85.             }
    86.         }
    87.         return $resp;
    88.     }
    89.    
    90.     function getAllPerms($format='ids')
    91.     {
    92.         $format = strtolower($format);
    93.         $strSQL = "SELECT * FROM `permissions` ORDER BY `permName` ASC";
    94.         $data = mysql_query($strSQL);
    95.         $resp = array();
    96.         while($row = mysql_fetch_assoc($data))
    97.         {
    98.             if ($format == 'full')
    99.             {
    100.                 $resp[$row['permKey']] = array('ID' => $row['ID'], 'Name' => $row['permName'], 'Key' => $row['permKey']);
    101.             } else {
    102.                 $resp[] = $row['ID'];
    103.             }
    104.         }
    105.         return $resp;
    106.     }
    107.  
    108.     function getRolePerms($role)
    109.     {
    110.         if (is_array($role))
    111.         {
    112.             $roleSQL = "SELECT * FROM `role_perms` WHERE `roleID` IN (" . implode(",",$role) . ") ORDER BY `ID` ASC";
    113.         } else {
    114.             $roleSQL = "SELECT * FROM `role_perms` WHERE `roleID` = " . floatval($role) . " ORDER BY `ID` ASC";
    115.         }
    116.         $data = mysql_query($roleSQL);
    117.         $perms = array();
    118.         while($row = mysql_fetch_assoc($data))
    119.         {
    120.             $pK = strtolower($this->getPermKeyFromID($row['permID']));
    121.             if ($pK == '') { continue; }
    122.             if ($row['value'] === '1') {
    123.                 $hP = true;
    124.             } else {
    125.                 $hP = false;
    126.             }
    127.             $perms[$pK] = array('perm' => $pK,'inheritted' => true,'value' => $hP,'Name' => $this->getPermNameFromID($row['permID']),'ID' => $row['permID']);
    128.         }
    129.         return $perms;
    130.     }
    131.    
    132.     function getUserPerms($userID)
    133.     {
    134.         $strSQL = "SELECT * FROM `user_perms` WHERE `userID` = " . floatval($userID) . " ORDER BY `addDate` ASC";
    135.         $data = mysql_query($strSQL);
    136.         $perms = array();
    137.         while($row = mysql_fetch_assoc($data))
    138.         {
    139.             $pK = strtolower($this->getPermKeyFromID($row['permID']));
    140.             if ($pK == '') { continue; }
    141.             if ($row['value'] == '1') {
    142.                 $hP = true;
    143.             } else {
    144.                 $hP = false;
    145.             }
    146.             $perms[$pK] = array('perm' => $pK,'inheritted' => false,'value' => $hP,'Name' => $this->getPermNameFromID($row['permID']),'ID' => $row['permID']);
    147.         }
    148.         return $perms;
    149.     }
    150.    
    151.     function userHasRole($roleID)
    152.     {
    153.         foreach($this->userRoles as $k => $v)
    154.         {
    155.             if (floatval($v) === floatval($roleID))
    156.             {
    157.                 return true;
    158.             }
    159.         }
    160.         return false;
    161.     }
    162.    
    163.     function hasPermission($permKey)
    164.     {
    165.         $permKey = strtolower($permKey);
    166.         if (array_key_exists($permKey,$this->perms))
    167.         {
    168.             if ($this->perms[$permKey]['value'] === '1' || $this->perms[$permKey]['value'] === true)
    169.             {
    170.                 return true;
    171.             } else {
    172.                 return false;
    173.             }
    174.         } else {
    175.             return false;
    176.         }
    177.     }
    178.    
    179.     function getUsername($userID)
    180.     {
    181.         $strSQL = "SELECT `username` FROM `users` WHERE `ID` = " . floatval($userID) . " LIMIT 1";
    182.         $data = mysql_query($strSQL);
    183.         $row = mysql_fetch_array($data);
    184.         return $row[0];
    185.     }
    186. }
    187.  
    188. ?>
    Или может есть что-то подобное,но более оптимизированное и из коробки, как это?