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