複数の企業が利用できるECサイト(楽天みたいな)をlaravel5.5で作る場合は、権限が複数(ユーザ・企業・システム管理者)必要なので、実装してみた。
1, ユーザ・アカウント
2, 企業アカウント
3, システム管理者
の3パターンの権限が必要
前のLTS(Long Term Support)のlaravel5.1だと、usersテーブルしかない。
laravel5.5だと、標準認証でusersテーブル以外も使い分けられる。
// ユーザ・アカウントでの認証
1, 標準認証の下準備
1 |
php artisan make:auth |
2, routes/web.php にてミドルウェアで認証の種類(標準)とURLを指定する
1 2 3 |
Route::group(['middleware' => 'auth:user'], function() { Route::get('/home', 'HomeController@index')->name('home'); }); |
これだけでusersテーブルを使った認証が実装できる。超簡単!
認証を追加するのは、これよりちょっとだけ面倒
// システム管理者での認証
1, adminテーブルを作る
1 |
php artisan make:migration create_admins_table |
usersテーブルと同じ構造のカラムにする
/database/migrations/xxxx_create_admins_table.php
1 2 3 4 5 6 7 8 |
Schema::create('admins', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('email')->unique(); $table->string('password'); $table->rememberToken(); $table->timestamps(); }); |
2, adminsテーブルのクラスを作る
1 |
php artisan make:model Admin |
Users.phpのコピペ(クラス名だけ変更)
/app/Admine.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<?php namespace App; use Illuminate\Notifications\Notifiable; use Illuminate\Foundation\Auth\User as Authenticatable; class Admin extends Authenticatable { use Notifiable; /** * The attributes that are mass assignable. * * @var array */ protected $fillable = [ 'name', 'email', 'password', ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ]; } |
3, config/auth.phpで認証の種類を定義する
guards = 認証の名称+認証情報の保持
provider = どのテーブルで認証するか+どの認証ドライバーを使うか
password = 有効期限とパスワードリセットの設置絵
基本的には、デフォルトのusersのコピペ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
'guards' => [ 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], ], 'passwords' => [ 'admins' => [ 'provider' => 'admins', 'table' => 'password_resets', 'expire' => 60, ], ], |
4, routes/web.php 認証フォームと認証後OKなURLを指定する
1 2 3 4 5 6 7 8 9 10 11 12 |
// 認証する前のログインフォーム画面 Route::group(['prefix' => 'admin'], function() { Route::get('/', function () { return redirect('/admin/home'); }); Route::get('login', 'Admin\LoginController@showLoginForm')->name('admin.login'); Route::post('login', 'Admin\LoginController@login')->name('admin.login'); }); // 認証した後のアクセスできるURLを指定 Route::group(['prefix' => 'admin', 'middleware' => 'auth:admin'], function() { Route::post('logout', 'Admin\LoginController@logout')->name('admin.logout'); Route::get('home', 'Admin\HomeController@index')->name('admin.home'); }); |
5, ログインフォームとログイン後のページのコントローラーを作る。面倒なので参照URLを見て
Admin/LoginController.php
Admin/HomeController.php
6, 管理者画面を作る
/resources/views/admin/login.blade.php
/resources/views/admin/home.blade.php
/resources/views/layout/app_admin.blade.php
7, usersテーブルは画面からレコードが作れるけど、adminはphpmyadmin か php artisan tinker か seeding でレコード生成する
1 2 |
$ php artisan tinker >>> App\Admin::create([‘name’ => ‘takahashi admin’, ‘email’ => ‘tadatsugu@takahashi-it.com’, ‘password’ => bcrypt(‘admin01’)]); |
企業アカウント(company_admin)もadminと同じ感じで作ればOKだった。
※app/Exceptions/Handler.phpにunauthenticatedメソッドが無かったので
admin以下のフォルダに未認証状態でアクセスしと時にログイン画面にリダイレクトするのが出来なかった。