В системе есть 2 раздела - условно назовём их первый и второй.
Есть пользователи которые будут иметь доступ только к первому
Есть пользователи которые будут иметь доступ только ко второму
Есть пользователи которые будут иметь доступ сразу к обоим
Есть СУПЕРпользователи которые создают остальных и дают им доступ
Первый вариант создать одну колонку в БД - роль. Варианты: one, two, double, super - доступ к первому разделу, второму, обоим, супер - админы
Второй вариант: на каждый раздел завести по колонке в БД и у каждого пользователя ставить 0 или 1 в зависимости от того имеет он туда доступ или нет.
Сегодня раздела 2, а завтра 5 и тогда первый вариант сразу посыпется, т.к. количество комбинаций слов станет слишком большим. Может ещё варианты которые я не учёл типа кода 12345 в одном поле? Задача что бы потом при добавлении раздела как можно меньше кода переписывать.
Дерево зависимостей: USER => Роль (Role/"User type") => Права доступа (ACL)
Создадим 2 колонки в таблице аккаунтов: Role и ACL.
1. Role в таблице аккаунта (на основе битовой маски / набор на основе степеней "2"-ки):
0 - public
1 - guest
2 - user
4 - editor
8 - ...
65536 - SUPER USER / SUPER ADMIN
2. ACL в таблице аккаунта (на основе битовой маски / набор на основе степеней "2"-ки):
0 - нет доступа никуда
1 - доступ к 1-му разделу
2 - доступ ко 2-му разделу
4 -
8 -
....
Теперь, складываем:
ACL: 1 = 1 => доступ к 1-у разделу.
ACL: 1+2 = 3 => доступ к 1-у и 2-му разделу.
1) ACL это что такое как расшифровывается?
2) Почему именно 128 суперюзер немного не понял, а не 127 например?
3) 129 лишнее значение 128 уже имеет доступ везде
4) Итоговое количество вариантов при 5 разделах сколько составит, я не запарюсь их проверять?
Оптимус Пьян: 1. ACL - Access Level
2. степень 2-ки: 2^7=128
3. не лишнее: если не нужно объединение с ОТДЕЛЬНЫМ типом (super user) - используйте сумму предыдущих (например, 1+2 - для доступа к 1 и 2-му разделу, и т.д.)
4. Для 5-и разделов: кол-во бит 5.
Числа для суммирования (для бит-маски): 0 (без доступа), 1 (1-ый), 2 (2-ой), 4 (3-ий), 8 (4-ый), 16 (5-ый раздел).
Сумма для всех 5: 1+2+4+8+16=31 => это права с доступа сразу ко всем разделам.
Можно прописать, что если есть права СРАЗУ НА ВСЕ разделы (ACL=31) - то это и будет "SUPER USER"-ом. (а можно завести после 31 - просто любой код, означающий, что это SuperUser, например: 999)
Оптимус Пьян: подумал, что лучше битовой маской сделать 2-е колонки:
1-е поле: роль (0 - пользователь, 1 - super_user)
2-е поле: ACL (как я уже описал в ответе)
Чтобы, если роли добавятся = это не повлияло на права и наоборот.