WackoWiki: YuriMakarov/ПраваДоступа/Группы ...

Home Page | Изменения | Новые Комменты | Пользователи | Каталог | Регистрация | Вход:  Пароль:  

Поддержка групп пользователей


В системе отсутствуют возможности создания Групп пользователей для разграничения полномочий. Это очень неудобно в работе, когда есть потребность в таком разграничении. При желании изменить полномочия на группу страниц (необязательно кластер) приходится все в ручную править. То же самое при появлении нового пользователя с некоторым набором полномочий.


Эту задачку можно очень просто решить.
Достаточно ввести в ACL еще один тип пользователя (в дополнение к * и $),
это ссылка на конкретную страницу. Она означает «Взять права доступа со страницы».


Примеры:


Достоинства этого метода



Тут еще много примеров придумать можно.
Этот метод управления полномочиями исключительно гибкий.


Реализация


В главном wakka.php нужно поправить функцию HasAccess

<?
  
function HasAccess($privilege$tag ""$user ""$tested = array())   // (Mak) добавлен параметр $tested
  
{
    
// see whether user is registered and logged in
   
if ($user!="guest@wacko")
   {
    if (
$user $this->GetUser()) $registered true;

    // set defaults
    
if (!$user $this->GetUserName());
   }
   if (!
$tag trim($tag)) $tag $this->GetPageTag();
   if (
in_array ($tag$tested)) return false;   // (Mak) Тест на зацикливание ссылок


   // load acl
   
$acl $this->LoadAcl($tag$privilege);
   
$acl['list'] = $this->ReplaceAliases($acl['list']);
   
$this->_acl $acl;


    // if current user is owner, return true. owner can do anything!
   
if ($user!="guest@wacko") if ($this->UserIsOwner($tag)) return true;
    
// fine fine... now go through acl
    
foreach (explode("\n"$acl["list"]) as $line)
    {
      
$line trim($line);


      // check for inversion character "!"
      
if (preg_match("/^[!](.*)$/"$line$matches))
      {
        
$negate 1;
        
$line $matches[1];
      }
      else
      {
        
$negate 0;
      }


      // if there's still anything left... lines with just a "!" don't count!
      
if ($line)
      {
        switch (
$line[0])
        {
        
// comments
        
case "#":
          break;
        
// everyone
        
case "*":
          return !
$negate;
        
// only registered users
        
case "$":
        case 
"§":
          return (
$registered) ? !$negate false// <- unregistered always False (Mak)
        // (Mak) Приверка группы доступа
        
case "@":
          
$tested[] = $tag;
          
$groupe_access $this->HasAccess($privilegesubstr($line,1), $user$tested);
          return (
$groupe_access) ? !$negate $negate;
        
// aha! a user entry.
        
default:
          if (
$line == $user)
          {
            return !
$negate;
          }
        }
      }
    }


    
// tough luck.
    
return false;
  }


Особенности списков доступа


Тестирование


 
Файлов нет. [Показать файлы/форму]
Комментариев нет. [Показать комментарии/форму]
Donate
Время работы: 12.793 s
Использовано памяти: 2.652 Mb