Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Разгранечение прав пользователей - готовый класс...

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Кривоват. Вопрос по оптимизации.
dropoff
Отправлено: 19 Июня, 2011 - 09:51:12
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Всем привет.

На одном сайте решил сделать разграничение прав доступа.
В принципе не сложно и самому написать, но получалось уж очень много все. И добавление прав и добавление групп...

Погуглив, набрел на готовое решение _http://net.tutsplus.com/tutorials/php/a-better-login-system/
Хоть статья там и большая... на деле там один файл с классом. Все остальное - формы управления. Именно "готовость" и повлияла на решение взять его.

По глупости начал внедрять сие дело к себе(уж очень понравилось управление всеми правами)... и потом решил проверить количество запросов... как не прискорбно, скрипт делает кучу запросов.
Методом "исследования", были выявлены места которые делают эти самые запросы.
С классами я на ВЫ, и переделать особо не получается.
Прошу помощи в оптимизации. Если у кого будет время, был бы признателен за помощь!

Теперь собственно сам класс

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


Для праверки прав, в нужные страницы просто вставить
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $myACL = new ACL();
  3. if ($myACL->hasPermission('access_admin') != true)// access_admin - группа, которой разрешен доступ на страницу
  4. {
  5.         header("location: /");
  6. }
  7. ?>


В самом начал метод buildACL. В нем как я понял проверяется индивидуальная роль(по описанию) юзера и используется метод getRolePerms.
А вот этот самый метод getRolePerms в цикле гоняет getPermKeyFromID и зачем то getPermNameFromID(зачем получать название роли не понятно)
Оба этих метода getPermNameFromID и getPermKeyFromID получают имя и ключ прав доступа.

На выходе получаем кучу запросов на каждой странице. И как я понял, чем больше всяких прав и групп, тем больше будет запросов.
В идеале для таких дел максимум пару запросов, а не 10 или 15.

Кто бы помог оптимизировать данный скрипт. Думаю многим бы пригодился, так как удобен и прост в установке.
Скачать полный скрипт можно тут _http://d2o0t5hpnwv4c1.cloudfront.net/232_customSiteAccess/download.zip
 
 Top
dropoff
Отправлено: 21 Июня, 2011 - 08:39:53
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Ребят, ну помогите кто-то.
Никак не получается избавиться от этих запросов.
 
 Top
dropoff
Отправлено: 22 Января, 2012 - 15:41:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Подниму тему, хоть и старовата.
Нет ли у кого или где-то подобных скриптов(из коробки), только более оптимизированных? Сколько гуглил, ничего интересного не нашел.
 
 Top
dropoff
Отправлено: 25 Января, 2012 - 05:20:20
Post Id



Посетитель


Покинул форум
Сообщений всего: 310
Дата рег-ции: Дек. 2010  


Помог: 0 раз(а)




Ребят, помогите пожалуйста переписать класс, чтобы не делал столько много запросов Огорчение
очень нужно сделать разграничение прав, а кроме данного решения, ничего путного не могу найти, а сам пока не осилю ни написать, ни переделать(
Если выставлять права индивидуально, то запросов вообще кучи получается.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB