2010-12-06 10 views
4

Я знаю, что vBulletin использует битпермы, я тоже их использовал, но когда я добрался до 10^63, они перестали работать, он не обрабатывал бы числа, большие, чем это (это мой хост PHP).Что такое хорошая система разрешений?

Мне любопытно узнать, что myBB, PhpBB, IPB, Joomla и другие скрипты в сети для систем разрешений, я действительно хочу использовать быструю настройку разрешения в моем скрипте. Прямо сейчас я внедрил переменную sql для каждого пользователя, называемую пермгруппами, и имел бы такое значение, как 1,4,5, и каждый из этих номеров соответствует группе разрешений, которая имеет аналогичную переменную, называемую файлами canseepages 1,2,3,4,1,4,1,54,6,4,5,22,6,2,3,4,1,2, которые соответствуют каждой странице, которую я имею.

Сначала я выбираю permgroups в PHP

Затем я использую PHP взорваться на permgroups

я сделать Еогеасп на каждой пермской группы пользователь может видеть

внутри Еогеасп я выполнить запрос SQL чтобы захватить canseepages переменных из группы разрешений

Я тогда приобщать это к переменной, так что я в конечном итоге с чем-то MASSIVE как

$variable = '1,2,3,4,5,6,7,8,9,2,22,55,44,55,33,44,11,44,33,44,11,33,44,'. 
'22,33,44,11,22,33,44,33,11,22,33,44,33,22,33,44,55,44,'. 
'55,54,26,77,84,645,345,233,11,4,11,3,32'; 

Эта переменная представляет все страницы, которые пользователю разрешено просматривать. Затем я взорву его в массив чисел, и я использую in_array(), чтобы проверить, просматривается ли текущая страница, которую они пытаются просмотреть, внутри этого массива страниц, которые им разрешено просматривать.

Это довольно быстро, но я просто думаю, что должен быть более быстрый способ сделать все это в целом.

+0

ролевого управления доступом? – Tower 2010-12-06 14:14:13

ответ

1

Я понял, долгое время назад, что битовые маски было наилучшим решением для доступа пользователей:

Короткий Пример:

class UserPermissions() 
{ 
    private $Mask = 0; 

    //Levels 
    const PUBLIC_READ = 1; 
    const PUBLIC_WRITE = 2; 
    const PUBLIC_EDIT = 4 
    const PUBLIC_DELETE = 8; 
    //ETC 

    public function __construct($Mask) 
    { 
     $this->Mask = $Mask; 
    } 

    public function InvokePermission($Bit) 
    { 
     return ($Mask & $Bit); //True/False 
    } 

    public function AddPermission($Bit) 
    { 
     $this->Mask |= $Bit; //Add the bit to the mask 
    } 

    public function RevokePermission() 
    { 
     $this->Mask &= ~ $Bit; 
    } 

    public GetMask() 
    { 
     return $this->Mask; 
    } 
} 

Простое использование так:

$Permissions = new UserPermissions($User->PermissionsData); 

if($Permissions->InvokePermission(Permissions:: PUBLIC_EDIT)) 
{ 
    //Use can edit 
} 

Некоторые ссылки:

+0

Не было бы более естественным использовать, если бы у вас были, а не константы, серии методов isBLANK? Затем я мог бы уменьшить код выше, если ($ Permissions-> isPublicEdit()) {} (то же самое для других действий) – DampeS8N 2010-12-06 14:39:19

4

Возможно, это не относится к вам, но обычно вы применяете разрешения для разделов системы, а не отдельных страниц. Так, например, у вас может быть разрешение «admin», которое открывает все разделы большого администратора.

У вас может быть менеджер perm, который открывает возможность добавлять, редактировать и удалять пользователей из системы. Поскольку крайне редко возникает потребность в ком-то, кто может совершать одно из, но не всех, этих вещей.

Альтернативой является система разрешений для конкретных задач. Этот сайт использует один, вы были достаточно долго, чтобы получить некоторые из них.

0

Почему бы не использовать массивы целых чисел в виде битмасков? Тогда вы просто сделать что-то вроде

$ndx = $pageNo/PHP_INT_SIZE; 
$bit = $pageNo % PHP_INT_SIZE; 
$canAccess = $permArray[$ndx] & (1<<$bit); 

$pageNo это номер страницы, пользователь пытается получить доступ, $permArray это массив целых чисел, представляющих допустимые страницы для группы. Если бит, соответствующий странице, установлен, пользователь может получить доступ к странице.

(Извините, если синтаксис неверен, я не использовал PHP в течение длительного времени.)

Смежные вопросы