2010-05-11 32 views
11

Tôi đã từng xem một bài viết về cách sử dụng một loại hệ thống đánh số cụ thể để quản lý vai trò. Người dùng sẽ được chỉ định một số vai trò cụ thể và tùy thuộc vào phép tính, con số có thể đứng cho nhiều vai trò.PHP: Quản lý vai trò với toán học?

Ai có thể chia sẻ kỹ thuật này với tôi hoặc chia sẻ liên kết không? Cảm ơn!

+0

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

Trả lời

20

Đâ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 :)

+0

Cảm ơn! Điều này thật đúng với gì mà tôi đã tìm kiếm. Nó rất dễ dàng để quản lý người dùng theo cách này !! –

+1

Câu trả lời rất hay! –

3

tôi nghĩ bạn đã nghe nói về "cờ bit". Tôi không biết tiếng Anh tốt cho điều đó (tôi là người Đức) - nhưng tôi nghĩ rằng Google sẽ cung cấp cho bạn một số liên kết tốt đẹp.

+0

Tôi đoán điều này sẽ trả lời những gì OP đang tìm kiếm –

+0

Cảm ơn sự giúp đỡ của bạn. Rõ ràng, tôi đã hỏi về "mặt nạ bit", như @Palantir có mô tả. –

Các vấn đề liên quan