jQueryTips by Tee++;

  • Home
  • Videos
  • jQueryTips's Fans

Coding like playing a piano.

Subscribe RSS

Search

Search

Sponsored

jQueryTips on Social

Followers

hide
Chainnnn Pang25441 Dexteri@n Ton KanexKane Supachai JustDoIt Rut petchy Tophit anndrew Webmaster

Categories

hide
  • Programing
  • Database
  • Framework
  • Mobile Development
    • Titanium Mobile
    • PhoneGap
  • Life

Tag Cloud

hide
PHP JavaScript MySQL XML Mobile jQuery CodeIgniter Hash php xml Debug Library Zend API Events Plugins Facebook Basic Registration Tool Twitter Search Swath Performance ffmpeg YouTube Web Service Yahoo! NoSQL MongoDB PhoneGap

Recent Posts

hide
  • ใครๆ ก็มี Utils เอางี้เราเพิ่ม Utils ให้กับ CodeIgniter กันบ้าง
  • แนะนำ JS.Class (A JavaScript class library)
  • PHP กับ OOP มาปูพื้นฐานกันเสียใหม่ก่อน
  • ประกาศข่าวสารจาก Admin
  • JSFIDDLE สุดยอด Tools สำหรับการ Debug การเขียนตัวอย่างโคด
  • Titanium Mobile + HTML + Native Scrolling
  • HTML to PDF ตัวไหนดี วันนี้ผมมีคำตอบ ...
  • ทำความรู้จักกับ JavaScript Pattern ในเชิงลึก
  • ผมบอกคุณแล้ว .... คนโง่ก็ Code ได้
  • วันนี้ มาออกแบบ Web Service ด้วย PHP กันเถอะ (CodeIgniter Version)

Recent Comments

hide
  • เยดดดด
  • มีตัวอย่าง CI แบบ เพียว ๆ ไหมครับ
  • ขอบคุณมากครับ เห็นแนวทางได้ชัดขึ้นจากตอนแรก ที่งงไปหมด ไม่รู้อะไรเป็นอะไร
  • ขอบคุณมากเลยครับท่าน....แหม่เพิ่มกำลังใจให้ผมได้เยอะเลย ตอนนี้กำลังฝึกงานอยู่ที่แห่งนึงในหาดใหญ่ พร้อมเด็กจากอีกสถาบันนึง 3 คน เราคิดว่าเรา…
  • Very good blog, I really like ~

Links

hide
  • OSCOOL
  • Architeture & Performance
  • Video and TV
  • Appcelerator
  • PhoneGap
  • Home
  •  » Blogs

มากำหนดสิทธิการเข้าถึงด้วย Zend ACL กันดีกว่า

Apr 1, 2009 12:21:36 AM | 5 Comments | in Framework | Zend, PHP
วันก่อนไปนั่งดู 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’);
/*——————————– 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 อยู่ จึงเข้าได้หมดอยู่แล้ว

ที่เหลือไปลองเล่นกันเองนะ ผมเหนื่อยแล้ว วันนี้อธิบายยาวมากๆ เลยอ่ะ

 

twitter stumbleupon delicious digg facebook

5 comments

Add comment Load previous All comments

Leave a comment

Post Comment

Powered by OSCOOL. You may view this on RSS or ATOM.

OSCOOL

  • Twitter
  • Facebook
  • Next