Sử dụng Acl trong cakephp – Phần 1
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
1 Comment to “Sử dụng Acl trong cakephp – Phần 1”
Post comment
Bài viết mới
- CakePHP version 1.3.12
- Tạo chuỗi ngẫu nhiên với 1 dòng code
- Kỹ thuật “bit field” trong phân quyền
- Làm việc với File và Folder
- CakePHP 1.3.8
- CakePHP 1.3.7 Released
- Ajax trong CakePHP
- Tạo và load file config trong CakePHP
- Làm site đa ngôn ngữ với CakePHP (Phần 1)
- CakePHP 1.3.6 and 1.2.9 released
- CakePHP 1.3.5 released
- Type hinting trong PHP
- CakePHP ra phiên bản mới 1.3.4
- Tích hợp Zend framework vào CakePHP
- Tạo virtual host trên local
- Sử dụng Acl trong cakephp – Phần 2
- Sử dụng Acl trong cakephp – Phần 1
- Sinh code tự động với cake console
- Tự động xóa record ở bảng con khi reocord ở bảng cha bị xóa
- Xác thực người dùng với component Auth
Thảo luận mới
- admin on Cách viết plugin cho CakePHP
- vinh on Xác thực người dùng với component Auth
- vinh on Sử dụng Acl trong cakephp – Phần 1
- hoaipt on Cách viết plugin cho CakePHP
- tuyền on Kỹ thuật “bit field” trong phân quyền
- admin on Tạo danh mục đa cấp với behavior Tree
- admin on Làm việc với File và Folder
- admin on Sinh code tự động với cake console
- admin on Kỹ thuật “bit field” trong phân quyền
- phùng ngọc lan on Tạo danh mục đa cấp với behavior Tree
TAG
Calendar
Lưu trữ
- September 2011 (3)
- July 2011 (1)
- March 2011 (1)
- February 2011 (1)
- November 2010 (4)
- October 2010 (1)
- September 2010 (2)
- August 2010 (9)
- July 2010 (9)
- June 2010 (22)
Blogroll
- Bakery
- Biển đảo Việt Nam
- CakePHP
- CakePHP Google Group
- CakePHP Manual
- CakePHP Questions
- Diễn đàn CakePHP VN

admin

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