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

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


Ý 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.  
  3.  
  4.  
  5.   
  6. $perms =new bitmask();  new bitmask();  
  7.   
  8.  
  9.  
  10.   
  11. $perms->permissions["read"]=true;  "read"]=true;  
  12. $perms->permissions["write"]=true;  "write"]=true;  
  13. $perms->permissions["delete"]=true;  "delete"]=true;  
  14. $perms->permissions["change_permissions"]=true;  "change_permissions"]=true;  
  15. $perms->permissions["admin"]=false;  "admin"]=false;  
  16.   
  17.   
  18. $bitmask = $perms->toBitmask();      
  19. $sql ="insert into user_permissions (userid,permission) values(1,$bitmask)";  "insert into user_permissions (userid,permission) values(1,$bitmask)";  
  20. echo $sql;    
  21. ?>  

Xuất giá trị:

  1.  
  2.  
  3.  
  4.   
  5. $permarr = $perms->getPermissions($bitmask);  
  6.   
  7. if($permarr["read"])  ($permarr["read"])  
  8. {  
  9.     echo 'user can read: TRUE';  'user can read: TRUE';  
  10. }else{  else{  
  11.     echo 'user can read: FALSE';  'user can read: FALSE';  
  12. }  
  13.   
  14.   
  15. if($permarr["write"])  ($permarr["write"])  
  16. {  
  17.     echo 'user can write: TRUE';  '
    user can write: TRUE'
    ;  
  18. }else{  else{  
  19.     echo 'user can write: FALSE';  '
    user can write: FALSE'
    ;  
  20. }  
  21.   
  22. ?>  

Xuất giá trị:

[Nghean-Aptech st]

Hướng dẫn php bitfield - php bitfield
Các tin mới hơn:

Hướng dẫn php bitfield - php bitfield
Hướng dẫn tích hợp giao diện trang quản trị SB Admin 2 vào Laravel 5.8.

Hướng dẫn php bitfield - php bitfield
Hướng dẫn tích hợp Google ReCaptcha v2 vào Laravel bằng curl.

Hướng dẫn php bitfield - php bitfield
Học lập trình React JS trong vòng 5 phút.

Hướng dẫn php bitfield - php bitfield
Sử dụng trình soạn thảo CKeditor tích hợp CKFinder với Laravel.

Hướng dẫn cài đặt Apache, PHP, MySQL, PHPMyAdmin trên Windows 10 và cấu hình SendMail.

Hướng dẫn php bitfield - php bitfield
Các tin cũ hơn:

Hướng dẫn php bitfield - php bitfield
Lựa chọn mô hình lập trình ASP.NET.

Hướng dẫn php bitfield - php bitfield
Giới thiệu nền tảng Windows Azure.

Hướng dẫn php bitfield - php bitfield
So sánh công nghệ Java và .Net.

Hướng dẫn php bitfield - php bitfield
Tại sao cần tránh viết SQL code trong ứng dụng?.