CakePHP 1.2.x: Action-based ACL

หลังจากที่ลองใช้ AuthComponent อย่างง่ายไปแล้ว. ผมก็อยากจะลอง ACL (Access control list) บ้าง ไม่รู้ว่าทำถูกวิธีหรือเปล่าด้วย. ผมก็เริ่มจากแก้ app_controller.php ใน cake/libs/controller เลย

class AppController extends Controller {
    var $components = array('Auth', 'Acl');

    function beforeFilter() {
        if(isset($this->Auth)) {
            $this->Auth->authorize = "actions";
            $this->Auth->userModel = 'User';
        }
   }
}

ACL ใน CakePHP ระบุความสัมพันธ์ระหว่าง ARO และ ACO. ARO ใน blog entry นี้ก็คือ user ของเว็บ. ส่วน ACO ของ CakePHP เป็นได้หลายอย่าง ได้แก่ controller, model และ action. ในที่นี้ผมระบุว่าใช้ action $this->Auth->authorize = “actions”; โดย action ก็คงประมาณว่าระบุเลยว่า user เข้าไปใช้หน้าไหนได้บ้างเช่น ระบุว่า user1 เข้าไปใช้ http://localhost/books/display1 ได้หรือเปล่า ระบุเป็นรายหน้าเลย.

หลังจากระบุไปแบบนี้แล้วผมก็ลอง login เพื่อที่จะไปเปิดดูหน้า http://localhost/books/display1 ผมก็คือเจ๊งตอบรูปข้างล่าง:

ที่ยังใช้ไม่ได้เพราะยังไม่ได้ใส่ข้อมูลใน ACL. ดูๆ แล้วการใช้ action-based acl เหมือนจะออกแรงเยอะชอบกล😛. เหมือนกัน. เราเพิ่ม acl ด้วย command line interface เริ่มจาก cd เข้าไปใน folder: cake/console แล้วใช้คำสั่งต่อไปนี้


./cake acl create aro ‘/’ ‘users’
./cake acl create aco ‘/’ ‘site’
./cake acl create aco ‘site’ ‘Pages’
./cake acl create aco ‘Pages’ ‘display’
./cake acl create aco ‘site’ ‘Books’
./cake acl create aco ‘Books’ ‘display1’
./cake acl create aco ‘Books’ ‘display2’
./cake acl create aco ‘site’ ‘Users’
./cake acl create aco ‘Users’ ‘login’
./cake acl create aco ‘Users’ ‘logout’
./cake acl grant ‘users’ ‘Pages/display’ ‘*’
./cake acl grant ‘users’ ‘Books/display1’ ‘*’

แล้วก็ยังไม่พอต้องเข้าไปแก้ database ตรงๆ อีกนิดหน่อย (ผมใช้ MySQL ในตัวอย่างนี้)

mysql -u<your_username> -p<your_password> my_project -e ‘set @userid = (select id from users where username = “myusername”); update aros set foreign_key = @userid, model = “User” where alias=”users”;’

เท่านี้ก็ลองเข้าไปในเว็บได้แล้ว หลังจาก login ที่หน้า http://localhost/my_project/users/login แล้ว. ก็ลองดูเว็บ page ใน http://localhost/my_project/books/display1 ก็ควรจะเข้าไปดูได้ แต่ถ้าเข้าไปใน http://localhost/my_project/books/display2 ก็จะถูก redirect กลับมาที่ http://localhost/my_project/

การใช้ acl แบบนี้ก็ยังมีปัญหาอยู่บ้าง ที่ว่าต้องมา grant สิทธิให้ user แต่ละคน กับหน้าแทบทุกหน้า เพราะ aco นึง map กับ user 1 คน … ถ้ามี user มากๆ ก็คงไม่เคยเหมาะ. ดังนั้นจึงน่าจะใช้ group เข้ามาช่วยได้ คือให้ aco เชื่อมกับ group แทน และระบุว่า group ไหน มี user คนไหนบ้าง.

อ้างอิง

http://aranworld.com/article/162/cakephp-acl-tutorial-initial-setup

3 thoughts on “CakePHP 1.2.x: Action-based ACL

ใส่ความเห็น

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / เปลี่ยนแปลง )

Twitter picture

You are commenting using your Twitter account. Log Out / เปลี่ยนแปลง )

Facebook photo

You are commenting using your Facebook account. Log Out / เปลี่ยนแปลง )

Google+ photo

You are commenting using your Google+ account. Log Out / เปลี่ยนแปลง )

Connecting to %s