วันอังคารที่ 30 พฤศจิกายน พ.ศ. 2553

Zend_Acl

Zend_Acl เป็น component สำหรับเอาไว้จัดการ การควบคุมการเข้าถึงข้อมูล (ผมพยายามแปลมาจาก ACL - Access Control List) อธิบายง่ายๆ คือเอาไว้คุมระดับของการใช้งาน insert/update/delete (หรืออื่นๆ) ข้อมูลนั่นเอง
ตัวอย่างเช่น Administrator ใช้งานหน้า admin สามารถ insert/update/delete ได้ทุกอย่าง, นาย A สามารถ insert/update/delete ข่าวได้อย่างเดียว และนาย B สามารถ insert/update/delete ข้อมูลสินค้าได้อย่างเดียว เป็นต้น
หรืออีกตัวอย่าง ถ้าเป็นกรณี Blogging service คุณเจ้าของ blog สามารถ read/write/publish/edit/delete blog ของตัวเองได้ และ guest (คนทั่วไป) สามารถ read ได้อย่างเดียว เป็นต้น
เหล่านี้เขาเรียกว่า ACL - Access Control List
ใน Zend_Acl ก็จะเกี่ยวข้องกับ 2 สิ่ง ได้แก่:
  • resource คือ สิ่งที่จะถูกคุม เช่น ข่าว, สินค้า, blog, อัลบั้มภาพ เป็นต้น โดยใน Zend_Acl ได้เตรียม Zend_Acl_Resource ไว้ให้ใช้ และมี Zend_Acl_Resource_Interface ไว้ให้ด้วย ถ้าจะ extends ไป implement
  • role คือ สิ่งที่จะทำการเข้าถึง resource เช่น การเขียน, การอ่าน, การลบ เป็นต้น โดยใน Zend_Acl ได้เตรียม Zend_Acl_Role ไว้ให้ใช้ และมี Zend_Acl_Role_Interface ไว้ให้ด้วย ถ้าจะ extends ไป implement
ฝรั่งเขาบอกว่า อธิบายง่ายๆ ได้ว่า "roles request access to resources"

ตัวอย่างการใช้งาน

สมมติว่าเรามีกฏ ในการใช้งานหน้า admin ดังนี้
NamePermissionsResource
news_staffinsert, update, deletenews
guestbook_staffinsert, update, deleteguestbook
administrator(Granted all access)N/A
เราสามารถสร้าง ACL ของเรา และ registry roles และ resources เข้าไป ดังนี้:
$acl = new Zend_Acl();
 
 // register resources เข้าไปใน acl หรือ เป็นการบอก acl ว่ามี resources อะไรบ้าง
 // หรือ ใน acl ของเรา มีข้อมูลอะไรบ้าง
 $acl->add(new Zend_Acl_Resource('news'));
 $acl->add(new Zend_Acl_Resource('guestbook'));
 
 // register roles เข้าไปใน acl 
 // หรือ ใน acl ของเรา มีการเข้าใช้งานแบบไหนบ้าง 
 // กรณีนี้ เราจะแบ่งเป็น type ของ admin คือเรามี admin 3 ประเภท 
 // ได้แก่ news_staff, questbook_staff และ administrator 
 // ซึ่งจะเข้าใช้งาน resource ได้ตามตารางด้านบน
 $acl->addRole(new Zend_Acl_Role('news_staff'));
 $acl->addRole(new Zend_Acl_Role('questbook_staff'));
 $acl->addRole(new Zend_Acl_Role('administrator'));
 
 // roles for 'news_staff'
 $acl->allow('news_staff', 'news',  'insert');
 $acl->allow('news_staff', 'news',  'update');
 $acl->allow('news_staff', 'news',  'delete');
 
 // roles for 'questbook_staff'
 $acl->allow('questbook_staff', 'questbook',  'insert');
 $acl->allow('questbook_staff', 'questbook',  'update');
 $acl->allow('questbook_staff', 'questbook',  'delete');
 
 // administrator ทำได้ทุกอย่าง (ทุก roles บนทุก resources) ถ้าไม่ระบุ resource และไม่ระบุ 
 $acl->allow('administrator');
เรามี ACL เรียบร้อยแล้ว ตอนจะเอาไปใช้ เช่นหลังจาก login เข้ามาแล้ว admin user นั้นทำอะไรได้บ้าง เราก็ไปถาม ACL ของเรา เช่น
// ประเภทของ admin user อาจจะได้จากหลังจาก login แล้ว 
 // เราก็ fetch เอาข้อมูลของ admin user นี้มาดู ว่าเขาเป็น type อะไร
 // ในที่นี้สมมตืว่าเขาเป็น news_staff
 $theAdminType = 'news_staff';
 // 'news_staff' ที่เป็นประเภทของ admin user ของเรานี้ จะถูกใช้เป็น key ของ roles
 
 echo $acl->isAllowed($theAdminType, 'news', 'insert') ?  
   'allowed' : 'denied'; // จะได้ allowed
 echo $acl->isAllowed($theAdminType, 'news', 'update') ?
   'allowed' : 'denied'; // จะได้ allowed
 echo $acl->isAllowed($theAdminType, 'news', 'delete') ?
  'allowed' : 'denied'; // จะได้ allowed
 
 echo $acl->isAllowed($theAdminType, 'guestbook', 'insert') ?  
   'allowed' : 'denied'; // จะได้ denied
 echo $acl->isAllowed($theAdminType, 'guestbook', 'update') ?
   'allowed' : 'denied'; // จะได้ denied
 echo $acl->isAllowed($theAdminType, 'guestbook', 'delete') ?
  'allowed' : 'denied'; // จะได้ denied
 // เมื่อระบุ resource เป็น 'guestbook' จะได้ 'denied' เพราะว่า $theAdminType เป็น 'news_staff'
 
 // ลองจำลองว่า ประเภทของ admin user เป็น administrator 
 $theAdminType = 'administrator';
 
 echo $acl->isAllowed($theAdminType, 'news', 'insert') ?  
   'allowed' : 'denied'; // จะได้ allowed
 echo $acl->isAllowed($theAdminType, 'news', 'update') ?
   'allowed' : 'denied'; // จะได้ allowed
 echo $acl->isAllowed($theAdminType, 'news', 'delete') ?
  'allowed' : 'denied'; // จะได้ allowed
 
 echo $acl->isAllowed($theAdminType, 'guestbook', 'insert') ?  
   'allowed' : 'denied'; // จะได้ allowed
 echo $acl->isAllowed($theAdminType, 'guestbook', 'update') ?
   'allowed' : 'denied'; // จะได้ allowed
 echo $acl->isAllowed($theAdminType, 'guestbook', 'delete') ?
  'allowed' : 'denied'; // จะได้ allowed
 
 // ได้ 'allowed' หมด เพราะว่า 'administrator' สามารถทำได้ทุกอย่าง กับทุก resources

ไม่มีความคิดเห็น:

แสดงความคิดเห็น