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()内を参考に、処理を記述しましょう。
おわり。









