Saturday, April 4, 2015

Access Control Lists ACL- phân quyền cho user

Hướng dẫn phân quyền trong cake php

Giải nén copy vào thư mục “\app\Plugin” lưu ý tạo thư mục có tên “AclExtras” rùi copy vào
Thêm dòng sau vào file  “/app/Config/bootstrap.php”
CakePlugin::load('AclExtras');
Tạo các bảng sau:
CREATE TABLE `acos` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `parent_id` int(10) DEFAULT NULL,
  `model` varchar(255) DEFAULT NULL,
  `foreign_key` int(10) DEFAULT NULL,
  `alias` varchar(255) DEFAULT NULL,
  `lft` int(10) DEFAULT NULL,
  `rght` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
CREATE TABLE `aros` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `parent_id` int(10) DEFAULT NULL,
  `model` varchar(255) DEFAULT NULL,
  `foreign_key` int(10) DEFAULT NULL,
  `alias` varchar(255) DEFAULT NULL,
  `lft` int(10) DEFAULT NULL,
  `rght` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
CREATE TABLE `aros_acos` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `aro_id` int(10) NOT NULL,
  `aco_id` int(10) NOT NULL,
  `_create` varchar(2) NOT NULL DEFAULT '0',
  `_read` varchar(2) NOT NULL DEFAULT '0',
  `_update` varchar(2) NOT NULL DEFAULT '0',
  `_delete` varchar(2) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `ARO_ACO_KEY` (`aro_id`,`aco_id`)
);
CREATE TABLE `users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `password` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `email` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
  `role` enum('admin','user','editor','') COLLATE utf8_unicode_ci DEFAULT 'user',
  `creusr` int(11) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1',
  `lastlogin` datetime NOT NULL,
  `group_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
CREATE TABLE `groups` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
);

Model User.php
<?php
App::uses('AppModel', 'Model');
App::uses('AuthComponent', 'Controller/Component');

class User extends AppModel {
var $actsAs = array('Acl' => array('type' => 'requester'));
       public $belongsTo = array('Group' => array(
            'className' => 'Group',
            'foreignKey' => 'group_id'
        ));
       function parentNode() {
           if (!$this->id && empty($this->data)) {
               return null;
           }
           if (isset($this->data['User']['group_id'])) {
               $groupId = $this->data['User']['group_id'];
           } else {
               $groupId = $this->field('group_id');
           }
           if (!$groupId) {
               return null;
           } else {
               return array('Group' => array('id' => $groupId));
           }
       }
}
Model Group.php
<?php
App::uses('AppModel', 'Model');
App::uses('AuthComponent', 'Controller/Component');

class Group extends AppModel {
      
       var $actsAs = array('Acl' => array('type' => 'requester'));
      
       function parentNode() {
           return null;
       }
}

Thêm tên controller, action vào db nhằm mục đích phân quyền trên controller,action
Nếu trên máy windows chưa có environment của cake console và php thì nên thêm vào ví dụ như sau:
C:\xampp\htdocs\truongmy\lib\Cake\Console
C:\xampp\php
Chạy câu lệnh sau:
cake -app "C:\xampp\htdocs\truongmy\app" AclExtras.Acl_extras aco_sync
lưu y` : C:\xampp\htdocs\truongmy\app là thư mục chứa project dang thực hiện

tiến hành phân quyền cho từng nhóm user trên controller và view
ta tạo TestController để thực hiện việc này, sau khi tạo xong chạy controller này trên web luôn :
<?php
App::uses('AppController', 'Controller');

class TestController extends AppController {

       public $components = array(
              'Acl');
       public function initDB() {
              try{
                     $this->loadModel('User');
                  $group = $this->User->Group;
             
                  // Allow admins to everything
                  $group->id = 1;
                  $this->Acl->allow($group, 'controllers');
             
                  // allow managers to posts and widgets
                  $group->id = 2;
                  $this->Acl->allow($group, 'controllers');
                     $this->Acl->deny($group, 'controllers/Users');
                     $this->Acl->deny($group, 'controllers/Os');
             
                  // allow users to only add and edit on posts and widgets
                  $group->id = 3;
                  $this->Acl->allow($group, 'controllers');
                  $this->Acl->deny($group, 'controllers/Users');
                     $this->Acl->deny($group, 'controllers/Products');
                  // allow basic users to log out
                  $this->Acl->allow($group, 'controllers/Login');
              }catch(Exception $e){
                     echo "<pre>";
                     print_r($e);
              }
      

    // we add an exit to avoid an ugly "missing views" error message
    echo "all done";
    exit;
}
}
?>

Tiến hành test và  xóa controller này sau khi test xong

No comments:

Post a Comment