Laravel5.2がでました。大目玉の機能として、ついに認証にMulti-Authドライバーがサポートされました。
LTSも公式に発表されているため、ひと安心です。
For LTS releases, such as Laravel 5.1, bug fixes are provided for 2 years and security fixes are provided for 3 years. These releases provide the longest window of support and maintenance.
For general releases, bug fixes are provided for 6 months and security fixes are provided for 1 year.
Multi-Auth(複数の認証)
Multi-Authとは、利用者、管理者、オペレータなどの、ロールごとに認証機能を切り分けて管理する方法です。
ユーザロール毎に個別のテーブルが利用できるため、一般ユーザと管理者でテーブルの項目をわけるなど、容易に対応することができます。
いままではフレームワーク側でサポートされていなかったため、外部ライブラリを利用するか、ユーザーテーブルにフラグを追加する方法で対応していましたが、Laravel5.2からは標準でドライバが付属しています。
ライブラリはLaravel4ではollieread/multiauth, Laravel5.1まではKbwebs/MultiAuthあたりが硬いところでしょうか。
フラグを追加する場合、ユーザインポート/エクスポート時の対応やロールの判定など、いろいろとめんどくさい調整をする必要がありました。
QuickStart
Laravel5をインストールします。インストール手順はこちら。
ここでは一記事で完結するよう、最初からやってみます。
環境は、Windows+XAMPP5.6.15+Netbeansです。
MacでもLinuxでも一緒です。
composerでインストール。
> composer create-project --prefer-dist laravel/laravel multiauth
Installing laravel/laravel (v5.2.0)
  - Installing laravel/laravel (v5.2.0)
    Loading from cache
Created project in multiauth
> php -r "copy('.env.example', '.env');"
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing vlucas/phpdotenv (v2.1.0)
    Loading from cache
  - Installing symfony/polyfill-mbstring (v1.0.1)
    Downloading: 100%
(略)
> php artisan clear-compiled
> php artisan optimize
Generating optimized class loader
> php artisan key:generate
Application key [ABCDEFGHIJKLMNOPQRSTUVWXYZ] set successfully.
できました。なんと簡単なことでしょう。おサルさんでもできるかもしれません。
とりあえず、通常の認証機能を自動作成します。
>php artisan make:auth Created View: \xampp\htdocs\multiauth\resources/views/auth/login.blade.php Created View: \xampp\htdocs\multiauth\resources/views/auth/register.blade.php Created View: \xampp\htdocs\multiauth\resources/views/auth/passwords/email.blade.php Created View: \xampp\htdocs\multiauth\resources/views/auth/passwords/reset.blade.php Created View: \xampp\htdocs\multiauth\resources/views/auth/emails/password.blade.php Created View: \xampp\htdocs\multiauth\resources/views/layouts/app.blade.php Created View: \xampp\htdocs\multiauth\resources/views/home.blade.php Created View: \xampp\htdocs\multiauth\resources/views/welcome.blade.php Installed HomeController. Updated Routes File. Authentication scaffolding generated successfully!
ななな、なんと、画面が完成してしまいました。登録・ログイン・パスワードリマインダーです!
ただし、データベースがないので動きません。マイグレーションを実行します。
>php artisan migrate [PDOException] SQLSTATE[HY000] [1045] Access denied for user 'homestead'@'localhost' (using password: YES)
と思ったら、データベースがなかった。
つくってコンフィグファイルを編集します。
コンフィグファイルはconfig/database.phpですが、/.envファイルで上書きできるのでローカル環境では.envを編集します。
DB_HOST=localhost DB_DATABASE=multiauth DB_USERNAME=root DB_PASSWORD=secret
.envファイルは、PHP dotenvのファイルで、Laravel5から標準で取り込まれています。
もう一回実行してみます。
>php artisan migrate Migration table created successfully. Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table
できました!
ユーザー登録・ログインをしてみます。
無事にうごきました。
さて、MultiAuth用に設定しようと思いますが、疲れてきました。
Adminテーブルを操作するためのモデルを作ります。app/Admin.phpが作成されます。
>php artisan make:model Admin Model created successfully.
中身をapp/User.phpモデルと同じにします。
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];
    /**
     * The attributes excluded from the model's JSON form.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}
マイグレーション・seedも作ります
>php artisan make:migration create_admin_table Created Migration: 2015_12_29_020639_create_admin_table >php artisan make:seeder UserTableSeeder Seeder created successfully. >php artisan make:seeder AdminTableSeeder Seeder created successfully.
ファイルを編集します。AdminテーブルのマイグレーションはUserテーブルと同一です。
2015_12_29_020639_create_admin_table.php
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAdminTable extends Migration
{
    public function up()
    {
        Schema::create('admins', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password', 60);
            $table->rememberToken();
            $table->timestamps();
        });
    }
    public function down()
    {
        Schema::drop('admins');
    }
}
UserTableSeeder.php
<?php
use Illuminate\Database\Seeder;
class UserTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('users')->truncate();
        for ($i = 1; $i < 100; $i++) {
            DB::table('users')->insert([
                'name' => 'テスト' . $i,
                'email' => 'test' . $i . '@example.com',
                'password' => bcrypt('password'),
            ]);
        }
    }
}
AdminTableSeeder.php
<?php
use Illuminate\Database\Seeder;
class AdminTableSeeder extends Seeder
{
    public function run()
    {
        DB::table('admins')->truncate();
        for ($i = 1; $i < 100; $i++) {
            DB::table('admins')->insert([
                'name' => 'テスト' . $i,
                'email' => 'admin' . $i . '@example.com',
                'password' => bcrypt('password'),
            ]);
        }
    }
}
DatabaseSeeder.php
<?php
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
    public function run()
    {
        $this->call(UserTableSeeder::class);
        $this->call(AdminTableSeeder::class);
    }
}
準備出来ました。マイグレーション、seedを実行します。
> php artisan migrate:refresh --seed Rolled back: 2014_10_12_100000_create_password_resets_table Rolled back: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_100000_create_password_resets_table Migrated: 2015_12_29_020639_create_admin_table Seeded: UserTableSeeder Seeded: AdminTableSeeder
できました!

ではドライバーの設定をしましょう。
config/auth.phpを編集します。
編集前
<?php
return [
    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    ],
    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
    ],
    'passwords' => [
        'users' => [
            'provider' => 'users',
            'email' => 'auth.emails.password',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],
];
編集後(userじゃなくてusersにしたほうがよかったかも・・・)
<?php
return [
    'defaults' => [
        'guard' => 'user',
        'passwords' => 'user',
    ],
    'guards' => [
        'user' => [
            'driver' => 'session',
            'provider' => 'user',
        ],
        'admin' => [
            'driver' => 'session',
            'provider' => 'admin',
        ],
    ],
    'providers' => [
        'user' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],
        'admin' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],
    ],
    'passwords' => [
        'user' => [
            'provider' => 'user',
            'email' => 'user.auth.emails.password',
            'table' => 'multiauth_password_resets',
            'expire' => 60,
        ],
        'admin' => [
            'provider' => 'admin',
            'email' => 'user.auth.emails.password',
            'table' => 'multiauth_password_resets',
            'expire' => 60,
        ],
    ],
];
ためします。ログイン画面対応がめんどくさいので簡易的にしました。
app/Http/routes.php
<?php
Route::get('/admin/login', function() {
    $auth = Auth::guard('admin');
    $credentials = [
        'email' => 'admin1@example.com',
        'password' => 'password',
    ];
    return $auth->attempt($credentials) ? 'Admin Success' : 'Admin Failure';
});
Route::get('/user/login', function() {
    $auth = Auth::guard('user');
    $credentials = [
        'email' => 'user1@test.com',
        'password' => 'password',
    ];
    return $auth->attempt($credentials) ? 'User Success' : 'User Failure';
});
ブラウザでアクセスします
http://[ドメイン]/admin/login

大成功。
ログイン画面を動作させるためには、\vendor\laravel\framework\src\Illuminate\Routing\Router.phpのauth()内を参考に、処理を記述しましょう。
おわり。










