PHP: Управлять ролями с математикой?

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

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

11
задан Mike Moore 11 May 2010 в 06:02
поделиться

2 ответа

Это битовая маска. Она работает следующим образом: вы назначаете каждой роли прогрессивный номер, затем, когда вы хотите назначить одну роль пользователю, вы выбираете номер этой роли. Если вы хотите добавить еще одну роль, вы просто добавляете номер этой роли к первоначальному. Вы можете добавить столько ролей, сколько пожелаете. Хитрость заключается в том, как вы выбираете числа: они равны степени 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 

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

(bitmask & 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

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

20
ответ дан 3 December 2019 в 04:51
поделиться

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

3
ответ дан 3 December 2019 в 04:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: