มากำหนดสิทธิการเข้าถึงด้วย Zend ACL กันดีกว่า
ซึ่งเป็นชุด lib ที่ใช้กำหนดระดับความสำคัญในการเข้าถึงข้อมูลส่วนต่างๆ ใน เว็บไซด์ ที่มีความสำคัญและต้องการความปลอดภัยในระดับนึง เช่น admin area เป็นต้น
โดยคำว่า ACL ย่อมาจาก Access control list นั่นเอง
การทำงานของ lib จะถูกแบ่งออกเป็น 2 ส่วนคือ
1. Role - อันนี้คือประเภทของผู้ใช้งาน
2. Resource - คือ Resource ที่จะทำงานด้วย เรียกภาษาชาวบ้านๆ ก็คือ หน้าต่างๆของเว็บ นั่นเอง
โดยหลังจากที่เรากำหนดใน 2 ส่วนนี้แล้ว เราก็ต้องมากำหนดอีกทีว่า Role ไหนจะเข้าถึง Resource ส่วนไหนได้บ้าง
และข้อดีที่สุดของ lib ตัวนี้คือ สามารถทำงานแบบ inherit หรือการถ่ายทอดคุณสมบัติ ได้ พูดไป พูดมาเดี๋ยวจะเรื่องยาวกันไปยัง มาดูวิธีการใช้งานไป ด้วยกันดีกว่า จะได้เข้าใจไปทีเดียวเลย
ก่อนอื่นก็ต้องไป Download ชุด libraries ของ Zend มาก่อนครับ โดยเลือกเอาแบบ Minimal ก็พอ ถ้าไม่ได้คิดจะเขียน Framework โดยใช้ Zend เป็น Core
Download Zend Framework Minimal
********** เริ่มต้นใช้งาน **********
// อันนี้ใครวาง path ไว้ไหนไป setup กันให้ถูกเองนะครับ
require_once('Zend/Acl.php');
require_once('Zend/Acl/Role.php');
require_once('Zend/Acl/Resource.php');
$acl = new Zend_Acl();
ทีนี้ก็ลองมาใช้งานกันดูเลยครับ
1. กำหนด Role ก่อน เป็นอันดับแรก
$acl->addRole(new Zend_Acl_Role('banned'));
$acl->addRole(new Zend_Acl_Role('member'));
$acl->addRole(new Zend_Acl_Role('writer'), 'member');
$acl->addRole(new Zend_Acl_Role('editor'), 'writer');
$acl->addRole(new Zend_Acl_Role('moderator'), 'editor');
$acl->addRole(new Zend_Acl_Role('administrator'));
ผมกำหนดระดับไว้ดังนี้ครับ banned, member, writer, editor, moderator, administrator โดยที่แต่ละตัว สืบทอดคุณสมบัติต่อๆกันมา ยกเว้น administrator ท่านเดียวเลย ซึ่งการสืบทอดแบบนี้จะทำให้ ระดับที่รับสืบทอดมา มีคุณสมบัติเหมือนตัวแม่ทุกประการ
2. มากำหนด resource ที่มีกันต่อไปเลย
$acl->add(new Zend_Acl_Resource('usercp'));
$acl->add(new Zend_Acl_Resource('usercp/settings'), 'usercp');
$acl->add(new Zend_Acl_Resource('usercp/album'), 'usercp');
$acl->add(new Zend_Acl_Resource('office'));
$acl->add(new Zend_Acl_Resource('office/users'), 'office');
$acl->add(new Zend_Acl_Resource('office/news'), 'office');
ตอนนี้ผมลองกำหนด resource โดยแบ่งระดับเป็น User's Control Panel และ Back Office โดยผมใช้ uri มาเป็นตัวกำหนด ลักษณะตัวอย่าง ดังนี้
http://www.domain.com/usercp/settings/addnew
สมมุติผมมี url ดังนี้ผมก็จะตัด ตั้งแต่ segment ที่ 1 - 3 ออกมา เป็น resource นั่งเอง
เอาล่ะๆ ถึงตอนสำคัญละ ...
3. กำหนดสิทธิ ให้แต่ละ Role ว่าใช้งาน Resource ไหนได้บ้าง
/*——————————— Baned ———————————*/ $acl->allow(‘banned’, ‘usercp/settings’); /*——————————– Member ——————————–*/ $acl->allow(‘member’, ‘usercp’); /*———————————- Writer ———————————*/ $acl->allow(‘writer’, ‘office/news’, array(‘addnew’)); /*———————————- Editor ———————————-*/ $acl->allow(‘editor’, ‘office/news’); /*——————————- Moderator ——————————-*/ $acl->allow(‘moderator’, ‘office’); $acl->deny(‘moderator’, ‘office/users’); /*—————————– Administrator —————————–*/ $acl->allow(‘administrator’); // Grant All
มาถึงตรงนี้มีข้อสังเกตุนิดหน่อยครับ ดังนี้
1. ทำไมกลุ่ม member กำหนด แค่ usercp ได้?
- ลองไปดูตอนเราทำการ add resource ครับจะเห็นว่า usercp เป็น parent ของ child ทั้งหมดในส่วนของมัน อันนี้เป็นคุณสมบัติ inherit ในตัว lib
2. ทำไม writer มีื array(‘addnew’) ด้วย?
- อันนี้เป็น สิทธิการเข้าถึงในระดับ action ครับ ซึ่ง lib อนุญาติให้ใช้งานได้ โดยที่ array อาจจะเป็นแบบนี้ก็ได้ array(‘addnew’, ‘edit’, ‘update’) จะหมายถึง อนุญาติใน 3 acts นี้
3. ทำไม administrator ไม่สืบทอด deny มาจาก moderator ล่ะ?
- ลองไปสังเกตุดูตอน register role ดูครับว่า administrator ไม่ได้ inherit มาจาก moderator
4. ทำไมไม่กำหนด resource ให้กับ administrator
- การไม่กำหนดเท่ากับให้สิทธิอย่างสมบูรณ์ ครับ โดยมีสิทธิเข้าได้ทุกหน้าจนกว่าจะสั่ง deny
เอาล่ะ มาถึงสุดท้ายละ ตอนทำการตรวจสอบสิทธิ
Url: http://www.domain.com/office/news/addnew
จาก URL ด้านบนผมก้จะใช้วิธีอะไรก็ได้ ตัด segment ที่ 1 – 3 ออกมาให้ได้ข้อมูลดังนี้
$segment_1 = ‘office/news’; $segment_2 = ‘addnew’; echo $acl->isAllowed(‘member’, $segment_1, $segment_2);
ถ้าเราเช็คข้อมูลตามแบบข้างบนผลที่ได้ก็จะออกมาเป็น false ครับ แต่ถ้าตั้งแต่ write ขึ้นไปจะสามารถ เข้าถึงในส่วนนี้ได้ทั้งหมด
เพราะอะไร?
1. เรากำหนดให้ writer เข้า หน้า office/news ที่มี action เป็นการ addnew ได้
2. เรากำหนดให้ editor เข้า หน้า office/news ได้ทั้งหมด
3. เรากำหนดให้ moderator เข้า office ซึ่งเป็น parent ของข้อมูลส่วนนี้ได้ ทั้งหมด
4. administrator เป็น Grant all อยู่ จึงเข้าได้หมดอยู่แล้ว
ที่เหลือไปลองเล่นกันเองนะ ผมเหนื่อยแล้ว วันนี้อธิบายยาวมากๆ เลยอ่ะ

5 comments