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

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


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

Эту задачку можно очень просто решить.
Достаточно ввести в 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;
  }



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

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