В системе отсутствуют возможности создания Групп пользователей для разграничения полномочий. Это очень неудобно в работе, когда есть потребность в таком разграничении. При желании изменить полномочия на группу страниц (необязательно кластер) приходится все в ручную править. То же самое при появлении нового пользователя с некоторым набором полномочий.
Эту задачку можно очень просто решить.
Достаточно ввести в 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($privilege, substr($line,1), $user, $tested);
return ($groupe_access) ? !$negate : $negate;
// aha! a user entry.
default:
if ($line == $user)
{
return !$negate;
}
}
}
}
// tough luck.
return false;
}
Особенности списков доступа
Тестирование