HOME>WEBプログラム覚書>[PHP]CakePHPのAuthメモ

[PHP]CakePHPのAuthメモ

CakePHPのAuthコンポーネントのセットアップメモ。

環境

こんな感じでAdminルーティングが設定してある。

APP/config/core.php

PHP

  1. <?php
  2. Configure::write('Routing.admin', 'admin');
  3. ?>

APP/config/routes.php

PHP

  1. <?php
  2. Router::connect('/admin', array('controller' => 'pages', 'action' => 'index', 'admin' => true));
  3. ?>

APP/config/controllers/app_controller.php

PHP

  1. <?php
  2. function beforeFilter()
  3. {
  4.     if (preg_match('/^admin/', $this->params['url']['url'])) {
  5.         $this->view = 'Theme';
  6.         $this->theme = 'admin';
  7.     }
  8. }
  9. ?>

設定

ほとんどのコントローラーにAdmin用のメソッドが存在してるので AppControlerでAuthコンポーネント使うぞ宣言する。

APP/controllers/app_controller.php

PHP

  1. <?php
  2. var $components = array('Auth');
  3. ?>

ヘルパーはbeforeFilter()で追加できるけどAuthはできない。(というかコンポーネントはできないのかな?)

PHP

  1. <?php
  2. function beforeFilter()
  3. {
  4.     $this->helpers[] = 'HogeHelper';//出来る
  5.     $this->components[] = 'Auth';//出来ない
  6. }
  7. ?>

利用するテーブルとカラムを変えるにはAuth::userModelとAuth::fieldsを設定する。

PHP

  1. <?php
  2. $this->Auth->userModel = 'Member';
  3. $this->Auth->fields = array(
  4.     'username' => 'account',
  5.     'password' => 'secretkey'
  6. );
  7. ?>

エラーメッセージなどの設定と、admin/以外のアクションは認証なしで 利用できるように設定する。

PHP

  1. <?php
  2. function beforeFilter()
  3. {
  4.     if (preg_match('/^admin/', $this->params['url']['url'])) {
  5.         $this->view = 'Theme';
  6.         $this->theme = 'admin';
  7.  
  8.         $this->Auth->userModel = 'Member';
  9.         $this->Auth->fields = array(
  10.             'username' => 'account',
  11.             'password' => 'secretkey'
  12.         );
  13.  
  14.         $this->Auth->loginError = 'パスワードが違います。';
  15.         $this->Auth->authError = '管理者用のページです。';
  16.  
  17.     } else {
  18.         // admin/以外は認証不要
  19.         $this->Auth->allow('*');
  20.     }
  21. }
  22. ?>

ログインとログアウトのアクションを追加する。

マニュアルそのまんまって感じです。

APP/controllers/members_controller.php

PHP

  1. <?php
  2. function admin_login() {}
  3.  
  4. function admin_logout() {
  5.     $this->redirect($this->Auth->logout());
  6. }
  7. ?>

ビューを作成する

こちらもマニュアルのサンプルがそのまま使える。 Users以外のモデルやカラムの場合変更が必要となる。

APP/view/theme/admin/members/admin_login.php

PHP

  1. <?php
  2. if ($session->check('Message.auth')) $session->flash('auth');
  3. echo $form->create('Member', array('action' => 'login'));
  4. echo $form->input('account');
  5. echo $form->input('secretkey');
  6. echo $form->end('Login');
  7. ?>

想像以上に簡単だ。単純にAuthを使う場合、悩むことはなさそう。 問題はACLとかAROとかACOが絡んできた時かな。そもそも機能がいまいち理解できてないしw

Authコンポーネントを有効にしたら出たエラー

Authコンポーネントを有効にしたら

PHP

  1. <?php
  2. Warning: Cannot modify header information
  3. ?>

というエラーが出た。ググってみるとheaderの前に何かしらの文字が出力されている可能性があるとのこと。 もしくはutf-8のbom付きだとなる模様。

まず疑うべきはコントローラーとかモデルの最後の「?>」の後ろに改行などがないか。

PHPの「?>」はZend Flameworkのコーディング規約でも書くなと言われていたはずなので、 書かないのがPHP界の常識なはず。でも書くな書くなと言われてもホントに?ほんとにいいの書かなくて? ってどーにも不安だったんですがこれからはきっちりと削除しようかとおもいました。

投稿日 2009年12月16日 04:30
カテゴリ PHP
タグ CakePHP | フレームワーク
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1200

コメント

コメントする
Name
Email Address
URL