I'm attending CakeFest 2010!

5.2 認証

The original text for this section has changed since it was translated. Please help resolve this difference. You can:

More information about translations

ユーザ認証システムは多くのウェブアプリケーションで一般的な仕組みです。CakePHP には、それぞれ異なるオプションを持つユーザ認証のシステムがいくつかあります。それらの中核を担う認証コンポーネントでは、ユーザがあるサイトにアカウントを持っているかどうかをチェックします。もしアカウントが存在すれば、コンポーネントはユーザに対してサイトへのアクセスを許可します。

このコンポーネントは ACL (アクセス制御リスト, Access Control List)コンポーネントと併せて使うことで、より複雑なサイト内のアクセス権限を作成できます。ACL コンポーネントは、例えば、あるユーザにはサイトの一般的な領域にアクセスすることを許可し、別のユーザには保護されたサイトの管理領域へのアクセスを許可するといったことを実現できます。

CakePHP の AuthComponent を使うと、こういったシステムを容易に、そして素早く作成できます。 ごく簡単な認証システムの作成方法を見てみましょう。

他の全てのコンポーネントと同じく、コントローラ内で使用するコンポーネントに「Auth」を加えることで、認証コンポーネントは使用可能になります。

class FooController extends AppController {
    var $components = array('Auth');
  1. class FooController extends AppController {
  2. var $components = array('Auth');

あるいは、全てのコントローラで認証コンポーネントを利用するのなら、 AppController に追加しても良いでしょう。

class AppController extends Controller {
    var $components = array('Auth');
  1. class AppController extends Controller {
  2. var $components = array('Auth');

AuthComponent を使うにあたり、いくつかの決まりごとがあります。 デフォルトでは、 AuthComponent は、「username」と「password」というフィールドを持つ「users」テーブルを使おうとします。しかし状況によっては、データベースでのカラム名に「password」というものは使えない場合があります。後ほど、それぞれの環境に適合させるためデフォルトで参照するフィールド名を変更する方法を説明します。

では、次の SQL 文を実行して、「users」テーブルをセットアップしましょう。

CREATE TABLE users (
    id integer auto_increment,
    username char(50),
    password char(50),
    PRIMARY KEY (id)
);
  1. CREATE TABLE users (
  2. id integer auto_increment,
  3. username char(50),
  4. password char(50),
  5. PRIMARY KEY (id)
  6. );

ユーザを認証するデータを格納するテーブルを作成する時に注意する点があります。それは、 AuthComponent は、データベースに格納するパスワードは平文ではなくハッシュ化されたものであることを期待する、という点です。 そのため、パスワードを保存するフィールドには、ハッシュを格納するのに十分な長さを持たせる必要があります。(例えば、 SHA1 だとハッシュの長さは40文字になります。)

最も基本的なセットアップは、コントローラ中に二つのアクションを作成するだけです。

class UsersController extends AppController {

    var $name = 'Users';    
    var $components = array('Auth'); // Not necessary if declared in your app controller
 
    /**
     * AuthComponent がログインに必要な機能を提供します。
     * そのため、この関数の中身は空にしておいてください。     */
    function login() {
    }

    function logout() {
        $this->redirect($this->Auth->logout());
    }
}
  1. class UsersController extends AppController {
  2. var $name = 'Users';
  3. var $components = array('Auth'); // Not necessary if declared in your app controller
  4. /**
  5. * AuthComponent がログインに必要な機能を提供します。
  6. * そのため、この関数の中身は空にしておいてください。 */
  7. function login() {
  8. }
  9. function logout() {
  10. $this->redirect($this->Auth->logout());
  11. }
  12. }

login() 機能を空にしても、ログインのビューのテンプレートは作成する必要があります。 (app/views/users/login.ctp に保存します。)UserController のビューテンプレートとして作成する必要があるものは、次のものだけです。 この例ではすでに Form ヘルパーを使用していると仮定しています。

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

このビューは、ユーザ名とパスワードを入力する単純なログインフォームを作成します。 このフォームを送信すると、 AuthComponent はログインに必要な処理を行います。また、 session->flash メッセージは、 AuthComponent が生成した全ての警告を出力します。

信じられないかもしれませんが、これでユーザ認証は完了です。ありえないほどシンプルですが、これが Auth コンポーネントとデータベースを用いた認証システムの使用方法です。とはいえ、すべきことは、まだたくさんあります。このコンポーネントのさらに進んだ使い方を見てみましょう。