Đây là một bitmask. Nó hoạt động như thế này: bạn gán cho mỗi vai trò một số tiến bộ, sau đó khi bạn muốn gán một vai trò cho một người dùng, bạn chọn số lượng vai trò đó. Nếu bạn muốn thêm vai trò khác, bạn chỉ cần thêm số vai trò đó vào vai trò ban đầu. Bạn có thể thêm bao nhiêu vai trò tùy thích. Bí quyết là như thế nào bạn chọn số của bạn: họ là những quyền hạn của 2.
Dưới đây là một ví dụ:
Role: Editor. Value: 2^0 = 1
Role: Manager. Value: 2^1 = 2
Role: Supervisor. Value: 2^2 = 4
Role: Admin. Value: 2^3 = 8
...
Để cung cấp cho một người sử dụng vai trò của biên tập viên, giúp bạn tiết kiệm từ 1 tới cơ sở dữ liệu, Để cung cấp cho người dùng vai trò của Trình chỉnh sửa, Người quản lý và Quản trị bạn lưu 1 + 2 + 8 = 11
Bạn có thể thấy lý do tại sao nó hoạt động, nếu bạn thấy nó là một mảng giá trị 1 hoặc 0.
|__|__|__|__|__|__|
16 8 4 2 1
Mỗi vai trò là 1 trong vị trí tương ứng. Vì vậy, trường hợp 11 của chúng tôi là:
|__|__|_1|_0|_1|_1|
16 8 4 2 1
Nếu bạn có một bitmask, và bạn muốn biết liệu người dùng có một vai trò nhất định, bạn sử dụng hoạt động này:
(bitmask & role_value)> = 1
Ví dụ:
(11 & 8)> = 1? có, do đó, người dùng có vai trò quản trị
(11 & 4)> = 1? không, do đó, người dùng không có vai trò giám sát
Nó được gọi là bitmask, bởi vì những gì bạn đang làm là "kiểm tra xem ở vị trí cụ thể có 1", nghĩa là "áp dụng mặt nạ sẽ đeo mặt nạ (đặt thành 0) tất cả các nơi, ngoại trừ một trong những bạn đang tìm kiếm):
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
Hy vọng nó sẽ giúp :)
tôi không biết về php nhưng trong unix, họ sử dụng nó, bạn có muốn có một câu trả lời trong hệ thống unix? – vodkhang