CentOS + Apache + MySQL + PHP & CakePHP-2.3.8 に、プラグイン「Plugin Acl」 を導入する。
※※2013/8/22 7.(6)追記:app/Controller/AppController.phpの編集が漏れていたため
CakePHPのアクセス制御リスト「ACL(Access Control List)」を、GUIで操作できるプラグインを導入します。
※1:CakePHP-2.3.8 の導入方法は、前々回記事参照→CakePHP-2.3.8のセットアップ
※2:CakePHP-2.3.8 は、/var/www/html/cakephp238/ にセットアップされています。
※3:CakePHP公式サイトの「ブログチュートリアル」を試す予定です。
→ http://book.cakephp.org/2.0/ja/getting-started.html#id2
※4:参考にさせて頂いたサイト
- CakePHP2で簡単にACLを使う方法 http://blog.asial.co.jp/1088
- CakePHP2でACLを超簡単管理できるプラグイン「ACL Plugin 2」 - 高橋 です http://takahashiyuya.hatenablog.com/entry/20120301/p1
1.プラグインダウンロードサイトから、ZIPファイルをダウンロードし、解凍
・http://www.alaxos.net/blaxos/pages/view/download_plugin_acl_2.0→2012-09-24 : Download ACL Plugin 2.2.0 をダウンロードします。
※上記バージョンで、2.3.8 で無事に実行出来ました。
2. フォルダ名のリネーム&アプリケーションのフォルダに移動
・解凍したフォルダ名を 「Acl」 に変更します。・以下のフォルダ配下に移動します。
→/var/www/html/cakephp238/app/Plugin/
3. プラグインの読み込みを追記、core.phpの確認
・cakephp238/app/Config/bootstrap.php へ、Aclの情報を追記最下段: CakePlugin::load(‘Acl’);
・cakephp238/app/Config/core.php の、Routing.prefixes を有効化
124行目: Configure::write(‘Routing.prefixes’, array(‘admin’));
・cakephp238/app/Config/core.php の、Acl関連 を有効化
235行目: Configure::write(‘Acl.classname’, ‘DbAcl’);
236行目: Configure::write(‘Acl.database’, ‘default’);
4. ACL用のテーブルを作成
・ユーザ情報テーブル:users を作成する。SQLは以下の通り。CREATE TABLE `users` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(50) default NULL,
`password` varchar(50) default NULL,
`group_id` int(11) NOT NULL,
`created` datetime default NULL,
`modified` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
・グループ情報テーブル:groups を作成する。SQLは以下の通り。
CREATE TABLE `groups` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`created` datetime default NULL,
`modified` datetime default NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
5. MVCを作成(CakePHPのbakeを使用)
・以下のコマンドを実行します。(※今回の環境では、/var/www/html/cakephp238/app/)[ユーザ名@ホスト名 app]$ php Console/cake.php bake all
→ users と groups の Model / View / Controller が作成されます。
※bake については、こちら:
→http://book.cakephp.org/2.0/ja/console-and-shells/code-generation-with-bake.html
6. ACL関連テーブルの作成
・以下のコマンドを実行します。(※今回の環境では、/var/www/html/cakephp238/app/)[ユーザ名@ホスト名 app]$ php Console/cake.php schema create DbAcl
→ テーブルacos 、 aros 、 aros_acos が作成されます。
- ARO:Access Request Object - オブジェクトを呼び出す側(使用する側)が登録されるtable
- ACO:Access Control Object - 呼び出される(使用される)オブジェクトが登録されるtable
- aros_acos: 上記2ファイルの権限設定が登録されるtable
7. ACLの有効化、グループとユーザを登録するため Model / View / Controller 修正
(1) app/Model/User.php・追記:
App::uses(‘AuthComponent’, ‘Controller/Component’);
・class User extends AppModel { 内に以下を追記:
public $actsAs = array('Acl' => array('type' => 'requester'));
public 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));
}
}
public function beforeSave($options = array()){
$this->data['User']['password'] = AuthComponent::password($this->data['User'][‘password’]);
return true;
}
※$belongsTo に ‘Group’ が設定されていること
(2) app/Model/Group.php
・class Group extends AppModel { 内に以下を追記:
public $actsAs = array('Acl' => array('type' => 'requester'));
public function parentNode(){
return null;
}
※$hasMany に ‘User’ が設定されていること
(3) app/View/Users/login.ctp を作成
<?php
echo $this->Form->create('User',array('action' => 'login'));
echo $this->Form->inputs(array(
'legend' => __('Login'),
'username',
'password'
));
echo $this->Form->end('Login');
?>
(4) app/Controller/UsersController.php
・class UsersController extends AppController { 内に以下を追記:
public function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow();
}
※function beforeFilter() は、全てのアクションを開放するメソッドなので、Group/User 登録後に削除する
public function login(){
if($this->request->is('post')){
if($this->Auth->login()){
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash('Your username or password miss mach.');
}
}
}
public function logout(){
//empty
}
(5) app/Controller/GroupsController.php
・class GroupsController extends AppController { 内に以下を追記:
public function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow();
}
※function beforeFilter() は、全てのアクションを開放するメソッドなので、Group/User 登録後に削除する
(6) app/Controller/AppController.php ※2013/8/22 追記(漏れてました)
・class AppController extends AppController { 内に以下を追記:
public $components = array(
'Acl',
'Auth' => array(
'authorize' => array(
'Actions' => array('actionPath' => 'controllers')
),
'flash' => array(
'element' => 'alert',
'key' => 'auth',
'params' => array(
'class' => 'alert-error'
)
)
),
'Session',
);
public $helpers = array(
'Session',
'Html' ,
'Form'
);
public function beforeFilter() {
$this->Auth->loginAction = array('controller' => 'users','action' => 'login');
$this->Auth->logoutRedirect = array('controller' => 'users','action' => 'login');
$this->Auth->loginRedirect = array('controller' => 'posts','action' => 'index');
}
8. グループの登録
・WEBブラウザで、ホスト名/cakephp238/groups/add にアクセスグループを登録します。
登録例):administrators, managers, users
※正常に登録されたら、aros テーブルに Group が登録されていることを確認してください。
→ 私は初め、7. の修正内容が誤っていたため、aros テーブルに登録されず、このあとの ユーザ登録でエラーが発生し、丸1日ハマりました・・・
9. ユーザの登録
・WEBブラウザで、ホスト名/cakephp238/users/add にアクセス・ 8. で登録した各グループに、ユーザを登録します。
登録例):adminuser, manageuser, useruser
※正常に登録されたら、aros テーブルに User が登録されていることを確認してください。
10. Plugin Acl のbootstrap.php を修正する
・app/Plugin/Acl/Config/bootstrap.php14行目 Role を Group に変更:Configure :: write('acl.aro.role.model', 'Group');
21行目 id を 追記:Configure :: write('acl.aro.role.primary_key', 'id');
28行目 group_id を 追記:Configure :: write('acl.aro.role.foreign_key', 'group_id');
33行目 追記なし:Configure :: write('acl.aro.user.model', 'User');
40行目 id を 追記:Configure :: write('acl.aro.user.primary_key', 'id');
45行目 追記なし:Configure :: write('acl.aro.role.display_field', 'name');
51行目 追記なし:Configure :: write('acl.role.access_plugin_role_ids', array());
57行目 追記なし:Configure :: write('acl.role.access_plugin_user_ids', array(1));
63行目 追記なし:Configure :: write('acl.user.display_name', "User.username");
68行目 追記なし:Configure :: write('acl.check_act_as_requester', true);
73行目 追記なし:App :: build(array('locales' => App :: pluginPath('Acl') . DS . 'locale'));
78行目 追記なし:Configure :: write('acl.gui.roles_permissions.ajax', true);
83行目 追記なし:Configure :: write('acl.gui.users_permissions.ajax', true);
※この後、Plugin Acl のGUI が機能しない場合、上記を app/Config/bootstrap.php に追記してください。
11. Plugin Acl の各Controller を修正する
・アクセス権限を、一時的に開放します。(1) app/Plugin/Acl/Controller/AclAppController.php
function beforeFilter() { 内に追記: $this->Auth->allow();
(2) app/Plugin/Acl/Controller/AclController.php
追記:
public function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow();
}
(3) app/Plugin/Acl/Controller/AcosController.php
追記:
public function beforeFilter(){
parent::beforeFilter();
$this->Auth->allow();
}
(4) app/Plugin/Acl/Controller/ArosController.php
function beforeFilter() { 内に追記: $this->Auth->allow();
12. Plugin Acl で、ACO を登録する
・WEBブラウザで、ホスト名/cakephp238/admin/acl/acos にアクセス・未登録の各アクションが一覧で表示され、ページ下部に 「Synchronize ACOs」があるので、クリックします。
ACL plugin のGUI画面が表示されたら、OKです。
各グループ単位、ユーザ単位に、各アクションの権限付与がGUIで操作できます。
以上です。