Ответ 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
Надеюсь, что это помогло:)