UsersとGroupsテーブルを作成する
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
);
Usersコントローラーにloginとlogoutのアクションを追加する
AppControllerに対して、AuthとACLのセットアップを行う
var $components = array('Auth', 'Acl', 'Session', 'Security');
function beforeFilter() {
parent::beforeFilter();
$this->Auth->authorize = 'actions';
$this->Auth->logoutRedirect = array('controller' => 'users', 'action' => 'login');
$this->Auth->loginRedirect = array('controller' => 'companies', 'action' => 'view');
$this->Auth->loginError = 'UIDかパスワードが違います';
$this->Auth->authError = 'アクセス権限がありません';
}
GroupsController と UsersControllerにアクセスできるように下記を追加する(一時的な設定)
function beforeFilter() {
parent::beforeFilter();
$this->Auth->allowedActions = array('*');
}
ACLのデータベースを初期化する
コンソールから以下を実行する
cake schema run create DbAcl
リクエスタとしてふるまう
User モデルに下記を追加
var $actsAs = array('Acl' => array('requester'));
function parentNode() {
if (!$this->id && empty($this->data)) {
return null;
}
$data = $this->data;
if (empty($this->data)) {
$data = $this->read();
}
if (!$data['User']['group_id']) {
return null;
} else {
return array(’Group’ => array(’id’ => $data['User']['group_id']));
}
}
Group モデルに下記を追加
var $actsAs = array('Acl' => array('requester'));
function parentNode() {
return null;
}
ここで、グループデータ、ユーザデータを登録してみる。
⇒arosテーブルにデータが作成されているのを確認
ACOを作成する
コンソールから下記を実行する
cake acl create aco root controllers
AppControllerに下記を追加する
※場所は、beforeFilter()の一番最後に追加した
$this->Auth->actionPath = 'controllers/';
AppControllerクラスに、buildAcl()メソッドを作成し、beforeFilter()メソッドの最後にbuildAcl()を呼び出すコードを記述する
function buildAcl() {
$log = array();
$aco =& $this->Acl->Aco;
$root = $aco->node('controllers');
if (!$root) {
$aco->create(array('parent_id' => null, 'model' => null, 'alias' => 'controllers'));
$root = $aco->save();
$root['Aco']['id'] = $aco->id;
$log[] = ‘Created Aco node for controllers’;
} else {
$root = $root[0];
}
App::import(’Core’, ‘File’);
$Controllers = Configure::listObjects(’controller’);
$appIndex = array_search(’App’, $Controllers);
if ($appIndex !== false ) {
unset($Controllers[$appIndex]);
}
$baseMethods = get_class_methods(’Controller’);
$baseMethods[] = ‘buildAcl’;
// app/controllers 中の、どのコントローラか調べる
foreach ($Controllers as $ctrlName) {
App::import(’Controller’, $ctrlName);
$ctrlclass = $ctrlName . ‘Controller’;
$methods = get_class_methods($ctrlclass);
// コントローラノードを探し、作成する
$controllerNode = $aco->node(’controllers/’.$ctrlName);
if (!$controllerNode) {
$aco->create(array(’parent_id’ => $root['Aco']['id'], ‘model’ => null, ‘alias’ => $ctrlName));
$controllerNode = $aco->save();
$controllerNode['Aco']['id'] = $aco->id;
$log[] = ‘Created Aco node for ‘.$ctrlName;
} else {
$controllerNode = $controllerNode[0];
}
// 親コントローラとプライベートのアクションを削除する
foreach ($methods as $k => $method) {
if (strpos($method, ‘_’, 0) === 0) {
unset($methods[$k]);
continue;
}
if (in_array($method, $baseMethods)) {
unset($methods[$k]);
continue;
}
$methodNode = $aco->node(’controllers/’.$ctrlName.’/’.$method);
if (!$methodNode) {
$aco->create(array(’parent_id’ => $controllerNode['Aco']['id'], ‘model’ => null, ‘alias’ => $method));
$methodNode = $aco->save();
$log[] = ‘Created Aco node for ‘. $method;
}
}
}
debug($log);
}
パーミッションの設定
UsersControllerに以下のinitDB()を追加して、beforeFilter()から呼び出す。
function initDB() {
//$group =& $this->User->Group;
App::import('Model', 'Group');
$group = new Group();
// 管理者グループには全てを許可する
$group->id = 1;
$this->Acl->allow($group, 'controllers');
// マネージャグループには posts と widgets に対するアクセスを許可する
$group->id = 2;
$this->Acl->deny($group, 'controllers');
$this->Acl->allow($group, 'controllers/Posts');
$this->Acl->allow($group, 'controllers/Widgets');
$this->Acl->allow($group, 'controllers/Users/logout');
// ユーザグループには posts と widgets に対する追加と編集を許可する
$group->id = 3;
$this->Acl->deny($group, 'controllers');
$this->Acl->allow($group, 'controllers/Posts/add');
$this->Acl->allow($group, 'controllers/Posts/edit');
$this->Acl->allow($group, 'controllers/Widgets/add');
$this->Acl->allow($group, 'controllers/Widgets/edit');
$this->Acl->allow($group, 'controllers/Users/logout');
}
ブラウザで、
http://(アプリケーションURL)/users
等に一回アクセスしパーミッションの作成が確認できたら、UsersControllerクラスからinitDB()メソッドと、beforeFilter()メソッド内のinitDB()の呼び出し行を削除する。
あわせて、GroupsController、UsersControllerクラスのbeforeFilter()メソッドから
$this->Auth->allowedActions = array(’*’);
の行を削除する。
Leave a Reply
You must be logged in to post a comment.