ハマログ

株式会社イーツー・インフォの社員ブログ

Laravel5.2のMulti-Auth

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.

できました。なんと簡単なことでしょう。おサルさんでもできるかもしれません。

20151228 225721

とりあえず、通常の認証機能を自動作成します。

>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!

ななな、なんと、画面が完成してしまいました。登録・ログイン・パスワードリマインダーです!

20151228 230110

ただし、データベースがないので動きません。マイグレーションを実行します。

>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

できました!

20151228 230958

ユーザー登録・ログインをしてみます。
無事にうごきました。

20151228 231121

さて、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

できました!

20151229 112045

ではドライバーの設定をしましょう。
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

20151229 113015

大成功。

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

おわり。

authLaravelLaravel5MultiAuthPHPユーザー認証

  kaneko tomo   2015年12月29日


関連記事

Laravel5.1のリリース

Laravel5.1がリリースされました。PSR-2の採用、イベントブロードキャ…

Laravelのパンくずリスト(Breadcrumb)の実装(リンクとJSON-LD)

Laravelのパンくずリストを実装します(ついでにJSON-LDも出力します)…

JenkinsとCircle CIを比較してる記事を読んでみた

はいどーも! 今、スタートアップ界隈で使っているCIといえば「Circle CI…


← 前の投稿

次の投稿 →