มากำหนดสิทธิการเข้าถึงด้วย Zend ACL กันดีกว่า
วันก่อนไปนั่งดู libraries ของ Zend ก็ได้ลองไปหลายตัวเหมือนกัน ส่วนมากจะโดนใจ ทั้ง DOM, Rest, Akismet, Recaptcha, Paginator คือเอาเป็นว่าลองตัวไหน ก็ไม่ผิดหวังเลยจริงๆ แต่ที่ จะมาพูดวันนี้เป็น lib ที่เกี่ยวกับการกำหนด สิทธิการเข้าใข้งานครับ มี ชื่อว่า “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’);
-
# กลุ่ม banned อนุญาติให้เข้าใช้งานที่ url:: /usercp/settings เท่านั้น
-
/*——————————– Member ——————————–*/
-
$acl->allow(‘member’, ‘usercp’);
-
# กลุ่ม member ให้ใช้งาน url:: /usercp/ ได้ทั้งหมด (usercp เป็น parent)
-
/*———————————- Writer ———————————*/
-
# กลุ่ม writer ให้ใช้งาน url:: /office/news ได้ใน action เดียวคือ การ add ข้อมูล
-
/*———————————- Editor ———————————-*/
-
$acl->allow(‘editor’, ‘office/news’);
-
# กลุ่ม editor ให้ใช้งาน ur:: /office/news ได้ทั้งหมด
-
/*——————————- Moderator ——————————-*/
-
$acl->allow(‘moderator’, ‘office’);
-
$acl->deny(‘moderator’, ‘office/users’);
-
# กลุ่ม moderator ให้ใช้งาน ur:: /office/ ได้ทั้งหมด ยกเว้น users
-
/*—————————– Administrator —————————–*/
-
$acl->allow(‘administrator’); // Grant All
-
# กลุ่ม administrator ให้ใช้งานได้ทั้งหมดเลย
มาถึงตรงนี้มีข้อสังเกตุนิดหน่อยครับ ดังนี้
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’; // อันนี้ถ้าไม่มี news ข้อมูลก็จะต้องเหลือแค่ office
-
$segment_2 = ‘addnew’; // อันนี้ถ้าไม่มีก็คือ null
ถ้าเราเช็คข้อมูลตามแบบข้างบนผลที่ได้ก็จะออกมาเป็น false ครับ แต่ถ้าตั้งแต่ write ขึ้นไปจะสามารถ เข้าถึงในส่วนนี้ได้ทั้งหมด
เพราะอะไร?
1. เรากำหนดให้ writer เข้า หน้า office/news ที่มี action เป็นการ addnew ได้
2. เรากำหนดให้ editor เข้า หน้า office/news ได้ทั้งหมด
3. เรากำหนดให้ moderator เข้า office ซึ่งเป็น parent ของข้อมูลส่วนนี้ได้ ทั้งหมด
4. administrator เป็น Grant all อยู่ จึงเข้าได้หมดอยู่แล้ว
ที่เหลือไปลองเล่นกันเองนะ ผมเหนื่อยแล้ว วันนี้อธิบายยาวมากๆ เลยอ่ะ -*-
You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.
เดียวจะลองเอาไปใช้กับ CodeIgniter บ้างน่าสนใจมากๆเข้าใจง่ายด้วย
คุณเขียนบทความอย่างนี้ มันเท่ากับว่ามาเพิ่มงานให้ผม เพราะเขียนบทความซะน่าสนใจ อดใจไม่ได้ที่จะต้องลองไปศึกษา เป็นการเพิ่มงานชัดๆ แต่ก็ดีใจนะ
[...] Download ตรงไหน กลับไปอ่านของเก่าๆ กัน ที่นี่ [...]
เท่ มากเลยพี่ ผมอดใจไม่ไหว ต้องลอง
ถ้ามีโอกาศเจอกัน เดวจะเลี้ยง โค้ก สักแก้ว อิอิ