2013年7月25日木曜日

CakePHP-2.3.8 に Plugin–Acl を導入する。

 

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:参考にさせて頂いたサイト
 

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 にアクセス
CakePHP-2.3.8-Screenshot005
  グループを登録します。
   登録例):administrators, managers, users
 ※正常に登録されたら、aros テーブルに Group が登録されていることを確認してください。
  → 私は初め、7. の修正内容が誤っていたため、aros テーブルに登録されず、このあとの ユーザ登録でエラーが発生し、丸1日ハマりました・・・

9. ユーザの登録

・WEBブラウザで、ホスト名/cakephp238/users/add にアクセス
CakePHP-2.3.8-Screenshot006
  ・ 8. で登録した各グループに、ユーザを登録します。
   登録例):adminuser, manageuser, useruser
 ※正常に登録されたら、aros テーブルに User が登録されていることを確認してください。

10. Plugin Acl のbootstrap.php を修正する

・app/Plugin/Acl/Config/bootstrap.php
   14行目 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」があるので、クリックします。
CakePHP-2.3.8-Screenshot007
ACL plugin のGUI画面が表示されたら、OKです。
各グループ単位、ユーザ単位に、各アクションの権限付与がGUIで操作できます。

以上です。

0 件のコメント:

コメントを投稿