速習Larave3(その9)、ユーザー認証No.1

タグ: Laravel3  

今回から2回に渡り、認証を取り入れます。

ユーザー認証には準備が多少必要ですからね。早速とりかかりましょう。

Laravelの認証自体はシンプルなものです。ユーザーテーブルを用意し、それを元に認証を行います。

認証はシンプルですが、ルートのフィルターとの組み合わせで、複雑な認証も実現できます。まあそれは皆さんにお任せして、今回は一番シンプルな形で実現しましょう。

まず、ユーザーテーブルがなければ話になりません。覚えていますか、マイグレーション?使いますよ、マイグレーション。

マイグレーションのコードを生成するためにArtisanコマンドラインを使うんでしたね。

php artisan migrate:make create_users_table

application/migrationsフォルダーに生成されたコードを開いてください。アルファベット順に並んでいるなら、一番下のPHPファイルですよ。なにせ先頭に生成日時が付きますからね。

内容は以下の通りです。

<?php

class Create_Users_Table
{

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users',
            function($table) {
                $table->increments('id');
                $table->string('username', 128);
                $table->string('password', 64);
                $table->timestamps();
            });
    }

    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }

}

タイムスタンプを生成しております。いらなければ外してください。でも、ユーザーの登録日などは、わりと知りたがられる情報です。残りのID、ユーザー名、パスワードが必要となります。特に長さの制限はありませんが、パスワードは暗号化の関係上、この程度が良いようです。本当かどうかは知りません。(前に調べたのですが、理由は忘れました。)

作成したら、マイグレーションを実行します。

php artisan migrate

上手く行ったら次に、ユーザーを一人分作成しましょう。マイグレーションを使う練習だと思い、再度生成してください。

php artisan migrate:make insert_admin_user

生成されたマイグレーションファイルは以下のように、入力してください。

<?php

class Insert_Admin_User
{

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        DB::table('users')
            ->insert(array(
                'username' => 'admin',
                'password' => Hash::make('admin'),
                'created_at' => date('Y-m-d H:i:s'),
                'updated_at' => date('Y-m-d H:i:s'),
            ));
    }

    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        DB::table('users')
            ->where('username', '=', 'admin')
            ->delete();
    }

}

ポイントはパスワードをHashクラスでハッシュし保存していることです。パスワードの平文保存は絶対に避けましょう。盗まれた場合、ユーザーに迷惑がかかります。

Laravelの認証はシンプルと言っても、多少のバリエーションが付けられます。設定ファイルを確認しましょう。config/auth.phpです。

ドライバーはLaravelのアクティブレコード/クエリービルダーであるFluentか、ORMであるEloquentが選べます。これは、Authクラスにより認証中のユーザー情報がuser()メソッドで取得できるのですが、渡ってくるインスタンスに違いがあるようです。(私はいつも、Eloqunetを指定します。)

'username' => 'email','password' => 'password',という、わけのわからない設定が続きますね。これは認証に使用するカラム名です。ユーザー名に当たるカラムに何を使用するか、パスワードとしてどのカラムを使用するかを指定します。デフォルトでユーザー名に当たるものはメールアドレスになっています。今回はメールアドレスを用意していませんので、usernameに書き換えてください。これを忘れると、エラーにはならないのですが、認証できずに悩むことになります。特に初心者のかたはやりがちですので、注意しましょう。(私は3度繰り返し、やっと覚えました。)

modelはEloquent ORMをドライバーで指定した場合に使用するORMモデルの名前です。デフォルト通り、Userのままにしてください。最後のtableはその名の通り、認証に使用するテーブルです。これもusersのまま、変更しません。

続いて認証に使用するUserモデルを作成しましょう。usersテーブルに対するUserです。Laravelのネーミングルールに従っていますね。変えても良いのですが、設定が増えるので素直に作成しましょう。

models.user.phpを作成してください。

<?php

class User extends Eloquent
{
    public static $timestamps = true;

    public function set_password($password)
    {
        $this->set_attribute('password', Hash::make($password));
    }

}

Postモデルとほぼ同じです。自動更新の$timestampsをtrueに設定しています。

目新しいのはset_passwordです。set_で始まるメソッドはセッターとしてEloquentでは扱われます。ですから、これはパスワードを保存する場合に、自動的にハッシュをかけてから、保存するように設定しているわけです。

認証に使用するからと言っても、特別の設定はありません。

これで、認証のための準備は終了です。いよいよコーディングに入ります。続きは次の記事です。