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で操作できます。

以上です。

CakePHP-2.3.8 にPlugin - DebugKit を導入する。


CentOS + Apache + MySQL + PHP & CakePHP-2.3.8 に、プラグイン「DebugKit」 を導入する。

※CakePHP-2.3.8 の導入方法は、前回記事参照→CakePHP-2.3.8のセットアップ
CakePHP-2.3.8-Screenshot002
上記スクリーンショットで、黄色で表示されているプラグイン「DebugKit」を導入します。
※1:CakePHP-2.3.8は、/var/www/html/cakephp238/ にセットアップされています。
※2:WEBブラウザで、ホスト名/cakephp238 にアクセスしています。

1. githubから zip をダウンロードし、解凍

・以下のサイトにある Download ZIP で、zipファイルをダウンロードし、任意のフォルダに解凍します。
   →https://github.com/cakephp/debug_kit

2. フォルダ名のリネーム&アプリケーションのフォルダに移動

・解凍したフォルダ名を 「DebugKit」 に変更します。
  ・以下のフォルダ配下に移動します。
   →/var/www/html/cakephp238/plugins/

3. プラグインの読み込みを追記、デバッグレベルを設定

・cakephp238/app/Config/bootstrap.php へ、DebugKitの情報を追記
   ※編集前にバックアップを取る(ファイルをコピーしておく)
   最下段: CakePlugin::load(‘DebugKit’);
  ・cakephp238/app/Config/core.php の debug モードを設定
   ※編集前にバックアップを取る(ファイルをコピーしておく)
   36行目: Configure::write(‘debug’, 2);

4. アプリケーションコントローラーで、DebugKitを読み込む

・cakephp238/app/Controller/AppController.php に追記
   class AppController extends Controller {
     public $components = array(‘DebugKit.Toolbar’);
   }

5. 標準のデバッグ機能で出力されるSQL結果を、非表示に変更

・cakephp238/app/View/Layouts/default.php から、以下の行を削除
     59行目:<?php echo $this->element(‘sql_dump’); ?>

6.WEBブラウザで、http://ホスト名/cakephp238 へアクセス

CakePHP-2.3.8-Screenshot004
DebugKit plugin が 緑になりました。
以上です。

CakePHP-2.3.8のセットアップ

PHP+MySQLのフレームワーク『CakePHP』、平成25年7月24日時点の最新版『2.3.8』を以下の環境にセットアップしました。

【作業環境:Windows7 64bit にインストールした VMPlayer 上に構築】
  •  OS : CentOS 6.4
  •  WEB-Server : Apache 2.2.15
  •  DB : MySQL 5.1.69
  •  PHP : PHP 5.3.3
※以前、学習用に CakePHP-2.1.0 をセットアップ済なので、PHP-MySQL で必要な環境は揃っている状態

1.CakePHP-2.3.8 を取得

・以下のサイトから、zipファイルをダウンロードし、全て展開する
  →https://github.com/cakephp/cakephp/releases/tag/2.3.8
 

2.WEBサーバのドキュメントへコピー

・CentOS 6.4 のドキュメントフォルダ(/var/www/html/)にフォルダ(cakephp238)を作成して、WinSCP でコピー
  → /var/www/html/cakephp238
  ※所有者を変更する # chown –R ユーザ名. /var/www/html/cakephp238
 

3.httpd.conf の修正

・cakephp238フォルダのredirectを有効にする。
    編集するファイル→ /etc/httpd/conf/httpd.conf
    ファイルの最後に以下を追記する
     <Directory “/var/www/html/cakephp238”>
                 AllowOverride All
     </Directory>
      ※編集が終わったら、サービスを再起動しておく(# service httpd restart
 

4.database、tableの作成

・MySQL に database と user を作成
     detabase 例): blog_sample
     user 例): bloguser / password
  ・上記MySQL database に table を作成
     table 例): posts
           ※今回は、CakePHP公式サイトの「ブログチュートリアル」を試す予定です。
     → http://book.cakephp.org/2.0/ja/getting-started.html#id2
  ・cakephp238/app/Config/database.php の内容を 上記 database 情報に変更する
   ※編集前にバックアップを取る(ファイルをコピーしておく)
    ‘login’ => ‘bloguser’,
    ‘password’ => ‘password’,
    ‘database’ => ‘blog_sample’,
         ‘encoding’ => ‘utf8’,  ※コメントを解除する
 

5.CakePHP定義ファイルの修正

    ・cakephp238/app/Config/core.php の セキュリティ情報を修正
   ※編集前にバックアップを取る(ファイルをコピーしておく)
   ・197行目:Configure::write(‘Security.salt’, ‘ここの文字列を推測されない値に編集’);
   ・202行目:Configure::write(‘Security.cipherSeed’, ‘ここの数字を、推測されない値に編集’);
 

6.tmpフォルダの権限修正

    ・書き込み権限を与える # chmod -R 0777 /var/www/html/cakephp238/app/tmp
 
7.WEBブラウザで、http://ホスト名/cakephp238 へアクセス
CakePHP-2.3.8-Screenshot002
以上です。

2013年7月12日金曜日

LAMPで開発することになりました。


前回のBlog更新(5/3)から、2ヶ月経つ間に、環境が激変しました。
これまで、派遣時代を含めて14年間常駐した会社との契約が6月末で終了となり、他の会社で新たに「LAMP開発」に携わることになったのです。
(LAMPによる業務システム開発プロジェクトに、フリーランスとして参加します)
5月中旬に契約することが確定したため、以降は引き継ぎなどで忙しく、セットアップしたXAMPPも使わないまま・・・
7月から、ローカル環境構築や、PHPフレームワーク(CakePHPです)などの開発技術習得で、早くも2週間が過ぎてしました。
環境構築は、以下の通り。(本当は細かくBlogに残せれば良かったのですが。)
  • VMware Player (無償版) :テスト用仮想環境構築
  • CentOS 6.4 :OS
  • Apache :WEBサーバ
  • MySQL :データベース
  • CakePHP :PHPフレームワーク
今後、なるべくBlogに残して行きたいと思います。