Aug
22

Sử dụng Acl trong cakephp – Phần 1

Author admin    Category Chia sẻ, Tutorial     Tags

Hôm nay mình sẽ hướng dẫn các tạo sử dụng Acl để phân quyền trong cakephp. Các bạn hình dung ứng dụng của chúng ta như sau: quản lý nhóm người dùng, quản lý người dùng, quản lý bài viết và phân quyền cho chi tiết cho từng nhóm người dùng.

1. Chuẩn bị ứng dụng

- Các bạn chạy đoạn sql dưới đây để tạo ra các bảng groups, users, posts

CREATE TABLE users (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(255) NOT NULL UNIQUE,
    password CHAR(40) NOT NULL,
    group_id INT(11) NOT NULL,
    created DATETIME,
    modified DATETIME
);
 
 
CREATE TABLE groups (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    created DATETIME,
    modified DATETIME
);
 
 
CREATE TABLE posts (
    id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    user_id INT(11) NOT NULL,
    title VARCHAR(255) NOT NULL,
    body TEXT,
    created DATETIME,
    modified DATETIME
);

2. Tạo controller, model, view

- Bước này các bạn tạo controller, model và view cho groups, users và posts. Mình sẽ không hướng dẫn bước này, các bạn có thể tạo bằng cake console hoặc bằng tay tuỳ ý.
- Xem thêm bài viết về sử dụng cake console

3. Gắn Auth

- Các bạn đọc thêm bài về sử dụng component Auth
- Trong users_controller.php: Thêm code login, logout (không cần code gì trong 2 hàm này cả, Auth tự làm giúp bạn!)

function login() {
    //empty
}
 
function logout() {
    //empty
}

- Tạo view để login: app/views/users/login.ctp

<?php
$session->flash('auth');
echo $form->create('User', array('action' => 'login'));
echo $form->inputs(array(
    'legend' => __('Login', true),
    'username',
    'password'
));
echo $form->end('Login');
?>

- Đưa code sau vào: /app/app_controller.php

<?php
class AppController extends Controller {
    var $components = array('Acl', 'Auth', 'Session');
 
    function beforeFilter() {
        //Configure AuthComponent
        $this->Auth->authorize = 'actions';
        $this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
        $this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
        $this->Auth->loginRedirect = array('controller' => 'posts', 'action' => 'add');
    }
}
?>

- Đưa code sau vào cả groups_controller.php và users_controller.php (vì ta còn truy xuất vào 2 controller này để làm một số việc, nếu không đặt code này vào thì bạn sẽ bị đẩy ra trang login khi truy cập vào 2 controller này)

function beforeFilter() {
    parent::beforeFilter(); 
    $this->Auth->allow(array('*'));
}

4. Tạo csdl cho Acl

- Các bạn chạy đoạn sql sau:

CREATE TABLE acos (
  id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  parent_id INTEGER(10) DEFAULT NULL,
  model VARCHAR(255) DEFAULT '',
  foreign_key INTEGER(10) UNSIGNED DEFAULT NULL,
  alias VARCHAR(255) DEFAULT '',
  lft INTEGER(10) DEFAULT NULL,
  rght INTEGER(10) DEFAULT NULL,
  PRIMARY KEY  (id)
);
 
CREATE TABLE aros_acos (
  id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  aro_id INTEGER(10) UNSIGNED NOT NULL,
  aco_id INTEGER(10) UNSIGNED NOT NULL,
  _create CHAR(2) NOT NULL DEFAULT 0,
  _read CHAR(2) NOT NULL DEFAULT 0,
  _update CHAR(2) NOT NULL DEFAULT 0,
  _delete CHAR(2) NOT NULL DEFAULT 0,
  PRIMARY KEY(id)
);
 
CREATE TABLE aros (
  id INTEGER(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  parent_id INTEGER(10) DEFAULT NULL,
  model VARCHAR(255) DEFAULT '',
  foreign_key INTEGER(10) UNSIGNED DEFAULT NULL,
  alias VARCHAR(255) DEFAULT '',
  lft INTEGER(10) DEFAULT NULL,
  rght INTEGER(10) DEFAULT NULL,
  PRIMARY KEY  (id)
);

- Trong đó:

  • aros: chứa model ứng với từng group
  • acos: chứa controller và toàn bộ action của controller đó. Trong đó có thành phần controllers, giữ vai trò là cha của các controller, nếu group nào có quyền trên controllers thì mặc nhiên có quyền trên toàn bộ các action của các cotroller khác
  • aros_acos: bảng phân quyền chi tiết

5. Sử dụng AclBehavior để liên kết group và user và Acl

- Mục đích: liên kết group và user vào Acl. Mỗi khi chúng ta tạo group và user, dữ liệu cũng sẽ được đưa vào bảng aros
- Chèn code sau vào model user.php

var $actsAs = array('Acl' => array('type' => 'requester'));
 
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));
    }
}

- Đưa code sau vào model group.php

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

1 Comment to “Sử dụng Acl trong cakephp – Phần 1”

  • vinh 18/12/2011 at 2:56 pm

    Cho mình toàn bộ mã nguồn cake_acl có sql luôn được không

Post comment

Follow us on Twitter! Follow us on Twitter!
Diễn đàn CakePHP cho người Việt Nam

Bài viết mới

Thảo luận mới

TAG

Calendar

August 2010
M T W T F S S
« Jul   Sep »
 1
2345678
9101112131415
16171819202122
23242526272829
3031  

Lưu trữ

Blogroll

Thống kê

Danh sách: 5 khách