PHP: управлять ролями с помощью математики?

Однажды я увидел статью о том, как использовать определенный тип системы нумерации для управления ролями. Пользователю будет назначен определенный номер роли, и в зависимости от расчета число может стоять за несколько ролей.

Может ли кто-нибудь поделиться этой техникой со мной или поделиться ссылкой? Спасибо!

Ответ 1

Это битмаска. Он работает следующим образом: вы назначаете каждой роли прогрессивное число, а затем, когда вы хотите назначить одну роль пользователю, вы выбираете номер этой роли. Если вы хотите добавить еще одну роль, просто добавьте этот номер роли в исходный. Вы можете добавить столько ролей, сколько пожелаете. Фокус в том, как вы выбираете свои номера: они являются полномочиями 2.

Вот пример:

Role: Editor.     Value: 2^0 = 1
Role: Manager.    Value: 2^1 = 2
Role: Supervisor. Value: 2^2 = 4
Role: Admin.      Value: 2^3 = 8
...

Чтобы предоставить пользователю роль редактора, вы сохраняете 1 в базе данных, Чтобы предоставить пользователю роли редактора, менеджера и администратора, вы сохраняете 1 + 2 + 8 = 11

Вы можете понять, почему это работает, если вы видите его как массив из 1 или 0 значений.

|__|__|__|__|__|__|
    16  8  4  2  1 

Каждая роль - 1 в соответствующем слоте. Итак, наш случай 11:

|__|__|_1|_0|_1|_1|
    16  8  4  2  1 

Если у вас есть битовая маска, и вы хотите знать, имеет ли пользователь определенную роль, вы используете эту операцию:

(битмаска и role_value) >= 1

Например:

(11 и 8) >= 1? да, поэтому у пользователя есть роль администратора
(11 и 4) >= 1? нет, поэтому у пользователя нет роли супервизора

Он называется битовой маской, потому что то, что вы делаете, это "проверить, есть ли в конкретной позиции 1", то есть "применить маску, которая будет маскировать (установить в 0) все места, кроме тот, который вы ищете):

11 --> |__|__|_1|_0|_1|_1|
           16  8  4  2  1 
 8 --> |__|__|_1|_0|_0|_0|  (mask)
           16  8  4  2  1 
AND -> |__|__|_1|_0|_0|_0|  Result: Yes

Надеюсь, что это помогло:)

Ответ 2

Я думаю, вы слышали о "бит-флагах". я не знаю хорошего английского turorial для этого (я немецкий), но я думаю, что google даст вам хорошие ссылки.