Home > CakePHP | PHP > CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント

CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント

この記事の所要時間: 226

CakePHPの管理者向けサイトにBasic認証を簡単に追加するコンポーネントです。

1.2系で動作しますが、ちょこちょこっといじれば1.1でも動くかと。

1. Routing.adminを有効にする

そもそもこれをやらないと意味がありません。[app/config/core.php]でRouting.adminを有効にします。

これにより[http://example.com/admin/~]のURLで管理者用アクションにアクセスできます。

   Configure::write('Routing.admin', 'admin');

2. 認証コンポーネントを設置

認証コンポーネントを[app/controllers/components/admin_auth.php]に設置します。

[2008/05/29] 継承元をComponentからObjectへ変更しました。(janさんありがとうございます!)

<?php
class AdminAuthComponent extends Object {
  /**
   * before filter
   */
  public function startup(&$controller) {
    if (!preg_match("/^" . Configure::read('Routing.admin')  . "_/i", $controller->action)) {
      return;
    }

    $user = env('PHP_AUTH_USER');
    $pass = env('PHP_AUTH_PW');

    if (empty($user) || empty($pass)) {
      $this->unauthorized($controller);
    } else {
      if (!$this->auth($user, $pass)) {
        $this->forbidden($controller);
      }
    }
  }

  /**
   * unauthorized
   *
   * @param  object Controller $controller
   */
  protected function unauthorized($controller) {
    header("WWW-Authenticate: Basic realm=\"Please Enter Your Password\"");
    $controller->redirect(null, 401, false);
    echo "Authorization Required";
    exit;
  }

  /**
   * forbidden
   *
   * @param  object Controller $controller
   */
  protected function forbidden($controller) {
    $controller->redirect(null, 403, false);
    echo "Authorization Required";
    exit;
  }

  /**
   * auth
   *
   * @param  string $user
   * @param  string $pass
   * @return boolean
   */
  protected function auth($user, $pass) {
    $hash = sha1($user . $pass . Configure::read('Security.salt'));
//debug: var_dump($hash);
    return $hash === ADMIN_AUTH_HASH;
  }
}
?>

3. AppControllerで読み込む

AppControllerの$componentsでAdminAuthComponentを読み込むだけでokです。これで[/admin/]なURLにアクセスされるとBasic認証を行い、認証が通った場合のみアクションを実行します。

<?php
class AppController extends Controller {
  public $components = array('AdminAuth');
}
?>

認証情報

上記ソースでは簡易的にユーザ名+パスワード+Security.saltでsha1ハッシュを生成して、それを定数ADMIN_AUTH_HASHと比較して認証を行っています。

ADMIN_AUTH_HASHは[app/config/core.php]等で定義しておけばokです。

ちなみにハッシュ値を簡単に作成するには、AdminAuthComponent#auth()でコメントアウトしているvar_dump()を有効にします。これでブラウザからアクセスしてユーザID・パスワードを認証ダイアログで入力すればハッシュ値が出力されます。

ハッシュ生成後はvar_dump()の行は削除する or コメントアウトするようにしましょう。

拡張とか

ここでは単純な実装になっていますが、AdminAuthComponentを変更すれば以下のような拡張が考えられます。

  • ハッシュ値では無くDBの値で認証
  • HTTPからのアクセスはHTTPSへリダイレクト
  • Basic認証を他の認証に変更

ちなみにRouting.adminのURLは単純にapache側で認証をかけるとすり抜けられる可能性があります。(@see:CakePHP URLマッピング修正パッチ)

このコンポーネントを使えばいかなるURLでアクセスされても、管理者用アクションを(初回)実行する際は認証を通過させることができます。

Pocket

follow us in feedly

コメント (Close):6

jan 08-05-28 (水) 4:45

コンポーネントの継承の部分なのですが、Componentからの継承であっているのでしょうか?
入力ダイアログがなかなか表示されないので試行錯誤していたのですが、マニュアルに書いてある通りにObjectから継承させると動いたもので。

shinbara 08-05-28 (水) 13:12

情報ありがとうございます!
1.2beta環境では、Componentからの継承で問題無いですよ。
1.1では試してませんが、若干修正が必要かもしれません;-)

jan 08-05-28 (水) 14:22

環境は1.2.0.6311です。
「cakephp “extends component”」でググってみたら、日本語のサイトではこちらのブログしかヒットしなかったので、アレ?と思ったり(苦笑)

shinbara 08-05-29 (木) 22:24

janさん:
同じ1.2betaですか。うーん、なんで動かないんでしょうね。

Componentを継承しているコンポーネントは他にも例があるので問題無いとは思いますが、book.cakephp.org見るとObjectを継承しているようなので、変更しますね。
# フレームワークのコンポーネントも
# Objectを継承してますね。

ご指摘ありがとうございます!

# 1.2ではComponentを継承するという話を見たような
# ソースを見たような記憶があったのですが
# 出典が思い出せません。。。

halt 08-06-29 (日) 14:51

そもそもComponentクラスがObjectクラスを継承してるからComponentで問題ないと思いますけどねえ。

custar 08-10-09 (木) 18:10

私もメソッド群を component に纏 (まと) めるため、component.php を眺めて
みました。

Component Class はソースの記述にある通り、Controller に読み込まれている
コンポーネントを纏めて扱う、単なるハンドラーでしかありません。

| /**
| * Handler for Controller::$components
| */
| class Component extends Object

ソース内に、Component に備わっているようなメソッドが幾つも見受けられま
すが、それらは単に個々のコンポーネントのメソッドを順に実行しているだけ
です。

よって、独自 Component を作成する場合、Component Class から呼び出される
それらのメソッドを実装すると、適当なタイミングで実行されるようになりま
す (callback)。

(1) init()
(2) initialize()
(3) startup()
(4) beforeRender()
(5) beforeRedirect()
(6) shutdown()

私も Component Class がコンポーネントの基底クラスかな、と予想していたの
ですが、そうではありませんでした。

沢山のコンポーネントを作成されるような場合、Object Class を継承した基底
クラスを独自に作り、そこから派生させていく、という手も考えられます。

対象 : cakephp v1.2 rc3

トラックバック:6

このエントリーのトラックバックURL
/blog/2008/01/cakephp_adminauthcomponent.html/trackback
Listed below are links to weblogs that reference
CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント from Shin x blog
pingback from [cakephp]1.2で管理者用アクションの設定をする | blog.hereticsintheworld 08-10-29 (水) 2:11

[…] 参考、関連サイト ・CakePHP URLマッピング修正パッチ ・CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント […]

pingback from 今週の管理人Bookmark (5/18-5/25) - ElectronicBrain is eating BreakFast 09-05-25 (月) 0:09

[…] CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント | Shin x blog […]

pingback from [CakePHP] 管理者画面でIP制限をかけてみる - ElectronicBrain is eating BreakFast 09-05-31 (日) 19:33

[…] CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント | Shin x blog […]

pingback from [CakePHP] CakePHP(PHP)でのBasic認証はPHPがCGI版で動いている場合は使えないようです « [ま]技術雑記 10-02-22 (月) 20:34

[…] CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント | Shin x blog http://www.1×1.jp/blog/2008/01/cakephp_adminauthcomponent.html […]

pingback from CakePHP(1.3)でBasic認証 | Code Life 11-10-19 (水) 14:55

[…] CakePHPで作ったサイトの管理者ページに簡単に認証を付ける場合、 以下のサイトにあるコンポーネントを使うことがあること思います。 【CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント】 http://www.1×1.jp/blog/2008/01/cakephp_adminauthcomponent.html […]

trackback from buy xanax online 12-03-19 (月) 14:00

Simply Amazing!…

I am often to blogging and i really appreciate your content. The article has really peaks my interest. I am going to bookmark your site and keep checking for new information….

Home > CakePHP | PHP > CakePHP 管理者サイトでBasic認証を簡単に行うコンポーネント

検索
フィード
メタ情報

Return to page top