Использование компараторов, таких как
if (admin) {do x}
else if (user) {do y}
Плохая идея, поскольку она негибкая и плохо масштабируется.
Есть несколько вариантов. Если ваши разрешения являются иерархическими, это означает, что один пользователь может делать все, а у пользователей с меньшими правами меньше прав, чем у пользователя выше, например
admin - 1, 2, 3
accountant - 1, 2
user - 1
Тогда вы можете дать им цифры и сказать
if (permissionValue => 500)
{
action2();
}
И есть таблица:
admin 1000
accountant 500
user 250
Это позволяет вам добавить новый тип пользователя (скажем, модератор) между администратором и бухгалтером, но не будет работать, если у вас есть:
admin 1, 2, 3
accountant 1, 2
moderator 1, 3
user 1
Поскольку разрешения для модератора и бухгалтера находятся на одном уровне.
На сегодняшний день лучшим решением является использование побитовых операторов и присвоение двоичных значений вашим защищенным областям.
Возьмем простой пример, где пользователь может читать контент, модератор может читать и писать контент, а администратор может читать, писать и удалять контент. Вы получите следующую таблицу (значения построены с использованием побитового или оператора)
Users: Read Write Delete
admin: 7 - (0b001 | 0b010 | 0b100) = 0b111 = 7
moderator: 3 - (0b001 | 0b010 | NO ) = 0b011 = 3
user: 1 - (0b001 | NO | NO ) = 0b001 = 1
Затем вы можете сделать:
//Permissions:
define('READ', 1);
define('WRITE', 2);
define('DELETE', 4);
if ($userPermissions & READ)
{
//Allowed to Read
}
if ($userPermissions & WRITE)
{
//Show write form
}
Это примеры побитовых операторов. Это означает, что если x содержит бит y, вернуть true. Для функции записи
User Permission
User Write
1 & 2
0b001 & 0b010 -- returns false
Admin Write
7 & 2
0b111 & 0b010 -- returns true
В первом примере 0b001 не содержит бит 0b010, поэтому возвращает false. 0b111 содержит бит 0b010 и возвращает true.
Подробнее Здесь