WinRoadのLaravel4初心者講座

次世代PHPフレームワークのLaravel4を初心者向けに解説して参ります。

Winroad徒然草の管理人がお届けします
開発メモ8_Verifyパッケージ

開発メモ8_Verifyパッケージ

このエントリーをはてなブックマークに追加

認証システムをSentry2を使って作った方が簡単かな、と思いSentry2でちょっと開発をしてみましたが、コマンド(メソッド)名が長く、Laravelの良さである(私がLaravelの良さだと思っている)記述のしやすさが損なわれるような気がしたので、Sentry2ほど多機能ではないですが、Verifyというパッケージの認証システムで開発を行うことにしました。

VefifyはLaravelのAuthシステムを継承して作成されていますので、Authの基本コマンドがそのまま使えますし、ModelもToddish\Verify\Models\Userを継承すれば、自前のUserモデルをそのまま使えますので、機能は少ないですが、便利です。

只、Artisanコマンドで、使用テーブルを取り込もうとしたら、エラーが発生して取り込めなかったので、いつものようにSetupコントローラにVerify関連テーブルを作成するためのコマンドを追加しました。

SetupControllerの作成

/*--------------------------------------------
|    verify関連テーブルの作成
|---------------------------------------------
*/
    //usersテーブルの存在確認
    public function getVerify(){
     if(Schema::hasTable('users')){
        $data['warning']='usersテーブルが存在しますので、処理を中止します。';
        return View::make('setup/index',$data);
    }

    Schema::create('permissions', function($table)
    {
            $table->engine = 'InnoDB';

            $table->increments('id');
            $table->string('name', 100)->index();
            $table->string('description', 255)->nullable();
            $table->timestamps();
        });

        // Create the roles table
        Schema::create('roles', function($table)
        {
            $table->engine = 'InnoDB';

            $table->increments('id');
            $table->string('name', 100)->index();
            $table->string('description', 255)->nullable();
            $table->integer('level');
            $table->softDeletes();
            $table->timestamps();
        });

        // Create the users table
        Schema::create('users', function($table)
        {
            $table->engine = 'InnoDB';

            $table->increments('id');
            $table->string('name', 30)->index();
            $table->string('password', 64)->index();
            $table->string('salt', 32);
            $table->string('email', 255)->index();
            $table->boolean('verified')->default(0);
            $table->boolean('disabled')->default(0);
            $table->timestamps();
            $table->softDeletes();
        });

        // Create the role/user relationship table
        Schema::create('role_user', function($table)
        {
            $table->engine = 'InnoDB';

            $table->integer('user_id')->unsigned()->index();
            $table->integer('role_id')->unsigned()->index();
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users');
            $table->foreign('role_id')->references('id')->on('roles');
        });

        // Create the permission/role relationship table
        Schema::create('permission_role', function($table)
        {
            $table->engine = 'InnoDB';

            $table->integer('permission_id')->unsigned()->index();
            $table->integer('role_id')->unsigned()->index();
            $table->timestamps();

            $table->foreign('permission_id')->references('id')->on('permissions');
            $table->foreign('role_id')->references('id')->on('roles');
        });

        $role_id = DB::table('roles')->insertGetId(array(
            'name' => Config::get('verify::super_admin'),
            'level' => 10,
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ));

        $user_id = DB::table('users')->insertGetId(array(
            'name' => 'admin',
            'password' => '$2a$08$rqN6idpy0FwezH72fQcdqunbJp7GJVm8j94atsTOqCeuNvc3PzH3m',
            'salt' => 'a227383075861e775d0af6281ea05a49',
            'email' => 'admin@example.com',
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s'),
            'verified' => 1,
            'disabled' => 0,
        ));

        DB::table('role_user')->insert(array(
            'role_id' => $role_id,
            'user_id' => $user_id,
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ));
        $data['warning']='全Verify関連の一括作成が完了しました。';
        return View::make('setup/index',$data);
    }
  • 上記のコマンドで、users,roles,permissons,role_user,pemission_roleの5つのテーブルが作成されます。
  • 只、既存テーブルの確認は、usersテーブルでしか行っていませんので、残りのテーブルの存在確認は、自分で行ってください。
  • 初期ユーザーは、adminでパスワードは「パスワード」でアクセスすることができます。パスワードは、Laravel3の時と同じなのですが、ドキュメントには記述がありませんでしたので、初めて使用する人は迷うと思います。
  • パスワードは標準のHashにsaltを掛け合わせて作成されていますので、標準のパスワードより複雑になっていますので、パスワードは解読しづらいように作成されています。
  • デフォルトからの変更点は、usernameをnameに変更しました。これは、Auth::user()->username、よりもAuth::user()->nameの方がすっきりすると言う私の私見で変更しました。
  • 上記の変更に伴い、vendor\toodish\verify\src\config.phpとapp\config\packages\toodish\verify\config.phpのidentyfied_byをusernameからnameに変更しましたが、これは、app\configの方だけで大丈夫だと思います。
  • また、もう1箇所vendor\toodish\verify\src\Toodish\Verify\Models\User.phpの28行目protected $fillableのusernameも同様にnameに変更しましたが、自前のモデルにprotected $fillableを記述しても大丈夫のはずです。

モデルの作成

UserモデルとRoleモデル、Permissonモデルは作成しなくても大丈夫ですが、やはり自前のモデルを使用したいので、モデルを下記のように作成します。

app/models/User.php

<?php
use Toddish\Verify\Models\User as VerifyUser;
//use Illuminate\Auth\UserInterface;
//use Illuminate\Auth\Reminders\RemindableInterface;

//class User extends Eloquent implements UserInterface, RemindableInterface {
class User extends VerifyUser{
    protected $fillable = array('name', 'password', 'salt', 'email', 'verified', 'deleted_at', 'disabled');
}
  • デフォルトのモデルにすぐに戻せるように、デフォルトは、コメントアウトしました。
  • これで、他のモデルとのリレーションとかも簡単に作成することができますし、スコープなども作成できます。

app/models/Role.php

<?php
use Toddish\Verify\Models\Role as VerifyRole;

class Role extends VerifyRole{
 protected $softDelete=true;
 protected $guarded=array('id'); 
}

app/models/Permissio.php

<?php
use Toddish\Verify\Models\Permission as VerifyPermission;

class Permission extends VerifyPermission{    
}

最後にapp/config/auth.phpの使用ドライバーをeloquentからverifyに変更すればVerifyが使えるようになります。

それでは、次回から基本的な認証システムは、Verifyを使用しながらサイトを構築していきたいと思います。これで、やっとメッセージシステムの開発に取りかかれます。

« »

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です