Hướng dẫn php bitfield - php bitfield

Kỹ thuật bit field trong phân quyền

Bài viết này sẽ hướng dẫn cho các bạn áp dụng kỹ thuật bit field trong phân quyền chức năng ứng dụng.

Mở đầu


Ý tưởng là dùng các bit để lưu trạng thái, hoặc phân quyền trong chương trình. Với cách lưu này thì mỗi trạng thái chỉ tốn 1 bit để lưu trữ. Vi dụ ta lưu 4 quyền view/add/edit/delete theo một dãy 0-1, được lưu trong một biến kiểu int. [Với kiểu int32 ta có thể lưu tối đa 32 trạng thái].

Full control [15]:


Delete Edit Add View
1 1 1 1

Tương ứng, ta lưu các quyền với các giá trị như sau:


Base Delete Edit Add View
Tương ứng, ta lưu các quyền với các giá trị như sau: 1000 100 10 1
Base Binary Bitwise 1 < 3 1 < 2
1 < 1 8 4 2 1

1 < 0


Decimal
view + add  = 1 + 2 = 3
view + add + edit = 1 + 2 + 4 = 7
view + add + edit + delete = 1 + 2  + 4 + 8 = 15

Bây giờ ta có các quyền được thể hiện như sau:

view = 1 view + add  = 1 + 2 = 3 view + add + edit = 1 + 2 + 4 = 7 view + add + edit + delete = 1 + 2  + 4 + 8 = 15

Chẳng hạn khi cần kiểm tra user có quyền edit hay không, ta chỉ cần lấy quyền của user và AND với giá trị edit [4] nếu nó khác 0 [và bằng chính quyền đó, trong trường hơp edit là 4] là user có quyền thực hiện quyền này.

Delete Edit Add View
0 1 1 1

Delete Edit Add View
0 0 1 1

Delete Edit Add View
0 0 0 1


Tương ứng, ta lưu các quyền với các giá trị như sau:

Base

Binary
- Thêm tin
- Xóa tin
- Sửa tin

Bitwise

1 < 3

  1. $bitfields_news = array[  
  2.     'canview' => 1,  'canview' => 1,  
  3.     'canadd' => 2,  'canadd' => 2,  
  4.     'canedit' => 4,  'canedit' => 4,  
  5.     'candelete' => 8];  'candelete' => 8];  

1 < 2

1 < 1

1 < 0

Decimal

Bây giờ ta có các quyền được thể hiện như sau:

view = 1 view + add  = 1 + 2 = 3 view + add + edit = 1 + 2 + 4 = 7 view + add + edit + delete = 1 + 2  + 4 + 8 = 15

Chẳng hạn khi cần kiểm tra user có quyền edit hay không, ta chỉ cần lấy quyền của user và AND với giá trị edit [4] nếu nó khác 0 [và bằng chính quyền đó, trong trường hơp edit là 4] là user có quyền thực hiện quyền này.

Bảng các quyền tương ứng với cơ số 10:
1_____admin______15
2_____editor______5

Edit-Add-View [7]

  1. if [$users['Group']['news_permission'] & 8] {   [$users['Group']['news_permission'] & 8] {  
  2.         
  3. }  

Ví dụ

Giả sử module tin tức trong ứng dụng của mình có 4 chức năng:

  1. decbin[15] = 1111  
  2. decbin[8] = 1000  

- Đọc tin - Thêm tin - Xóa tin - Sửa tin

Mình cần phân quyền cho 2 nhóm: admin và editor

  1. Áp dụng kỹ thuật bit field, mình sẽ cho mỗi chức năng của module tin tức 1 con số đại diện, và lưu thành mảng:
  2. class bitmask   bitmask  
  3. {  
  4.      
  5.  
  6.  
  7.  
  8.  
  9.  
  10.  
  11.   
  12.     public $permissions = array[  public $permissions = array[  
  13.                                 "read"=>false,  "read"=>false,  
  14.                                 "write"=>false,  "write"=>false,  
  15.                                 "delete"=>false,  "delete"=>false,  
  16.                                 "change_permissions"=>false,  "change_permissions"=>false,  
  17.                                 "admin"=>false  "admin"=>false  
  18.                                 ];  
  19.   
  20.      
  21.  
  22.  
  23.  
  24.  
  25.  
  26.  
  27.   
  28.     publicfunction getPermissions[$bitMask =0]  
  29.     {  
  30.         $i =0;  
  31.         foreach[$this->permissions as $key => $value]  foreach[$this->permissions as $key => $value]  
  32.         {  
  33.             $this->permissions[$key]=[[$bitMask & pow[2, $i]]!=0]?true:false;  this->permissions[$key]=[[$bitMask & pow[2, $i]]!=0]?true:false;  
  34.                 
  35.                 
  36.             $i++;  
  37.         }  
  38.         return $this->permissions;  return $this->permissions;  
  39.     }  
  40.   
  41.      
  42.  
  43.  
  44.  
  45.  
  46.  
  47.   
  48.     function toBitmask[]  
  49.     {  
  50.         $bitmask =0;  
  51.         $i =0;  
  52.         foreach[$this->permissions as $key => $value]  foreach[$this->permissions as $key => $value]  
  53.         {  
  54.   
  55.             if[$value]  if[$value]  
  56.             {  
  57.                 $bitmask += pow[2, $i];  
  58.             }  
  59.             $i++;  
  60.         }  
  61.         return $bitmask;  return $bitmask;  
  62.     }  
  63. }  
  64. ?>  

Lưu vào cơ sở dữ liệu:

  1.    
  2.   

Xuất giá trị:

Bài Viết Liên Quan

Chủ Đề