以下の要件を想定
- /user以下は登録ユーザしかアクセスを許さない (要認証)
- /admin以下は管理者しかアクセスを許さない (要認証)
- それ以外は認証なしでアクセスできる
- ユーザはusersテーブルで管理する
- 管理者はadminsテーブルで管理する
- 登録ユーザのログインは/login、ログアウトは/logout
- 管理者のログインは/admin/login、ログアウトは/admin/logout
以下、実装手順をざっくり。
(1) 標準Authの有効化と管理者の追加
標準のAuthを有効化する
adminsテーブルを作成
|
php artisan make:migration create_admins_table --create=admins |
とりあえずadminsテーブルの構成はusersテーブルと同じにしておく。
Adminモデルを作成
|
php artisan make:model Admin |
とりあえずAdminモデルの構成はUserモデルと同じにしておく。
マイグレーション実行
Authの設定
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
// config/auth.php return [ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], 'user' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Admin::class, ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, ], 'admins' => [ 'provider' => 'admins', 'table' => 'password_resets', 'expire' => 60, ], ], ]; |
(2) 管理者ログインの仕組みを作成
実装の手間を減らすために、標準のログインの仕組みを可能な限り流用する方針で行く。
標準のログインコントローラ(app/Http/Controllers/Auth/LoginController.php)をapp/Http/Controllers/Admin/Auth/LoginController.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
|
namespace App\Http\Controllers\Admin\Auth; use ... class LoginController extends Controller { use AuthenticatesUsers; protected $redirectTo = '/admin/home'; //管理者ログイン成功後のジャンプ先 public function __construct() { $this->middleware('guest', ['except' => 'logout']); } public function showLoginForm() { return view('admin.auth.login'); //管理者ログインページのテンプレート } protected function guard() { return Auth::guard('admin'); //管理者認証のguardを指定 } } |
標準のログインページのテンプレート(resources/views/auth/login.blade.php)をresources/views/admin/auth/login.blade.phpへコピーして、管理者ログイン用にカスタマイズする。
|
{{-- 最低限actionのurlは変更必要 --}} <form class="form-horizontal" role="form" method="POST" action="{{ url('/admin/login') }}"> |
(3) 管理者ログインページへの転送を追加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
// app/Exceptions/Handler.php class Handler extends ExceptionHandler { protected function unauthenticated($request, AuthenticationException $exception) { if ($request->expectsJson()) { return response()->json(['error' => 'Unauthenticated.'], 401); } //追加 if (in_array('admin', $exception->guards())) { return redirect()->guest('admin/login'); } //追加 return redirect()->guest('login'); } } |
(4) ルーティングを定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
// routes/web.php Auth::routes(); Route::get('/home', 'HomeController@index'); Route::group(['prefix' => 'user'], function() { Route::get('/', 'UserController@index'); Route::get('/home', 'UserController@index'); }); Route::group(['prefix' => 'admin'], function() { $this->get('login', 'Admin\Auth\LoginController@showLoginForm'); $this->post('login', 'Admin\Auth\LoginController@login'); $this->post('logout', 'Admin\Auth\LoginController@logout'); Route::get('/', 'Admin\HomeController@index'); Route::get('/home', 'Admin\HomeController@index'); }); |
(5) コントローラに認証要件を追加
|
// UserController.php namespace App\Http\Controllers; use ... class UserController extends Controller { public function __construct() { $this->middleware('auth:user'); } } |
|
// Admin/HomeController.php namespace App\Http\Controllers\Admin; use ... class HomeController extends Controller { public function __construct() { $this->middleware('auth:admin'); } } |
参考サイト
Authentication – Laravel
https://laravel.com/docs/5.3/authentication