2018/10/12

前回、LaravelのMultiAuth機能を使ってユーザー側の認証画面を作成しました。
今回は管理者側の認証画面を作成します。
目的
前回作成したユーザー側の認証画面に加えて管理者側の認証画面を作成
画面遷移図
進め方
【1】管理者用のDBテーブルを作成
【2】config/auth.phpにユーザー・管理者のアカウント設定
【3】管理者用モデルの作成
【4】管理者用コントローラの作成
【5】管理者用ミドルウェアの編集
【6】管理者用ルーティング設定
【7】管理者用ビュー作成
【1】管理者用のDBテーブルを作成
管理者のテーブルを作成します。
Laravel5.2にデフォルトでついていたusersのマイグレーションファイルをコピーして作成します。
管理者用のDBテーブルはadminsにします。
なので、usersをadminsに書き換えます。
?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateAdminTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('admins');
}
}
artisanコマンドで編集したマイグレーションファイルを実行します。
php artisan migrate
マイグレーションファイルの中身を
なお、認証機能で必要なpassword_resetsテーブルはユーザー側の認証画面と共有して利用します。
【2】config/auth.phpにユーザー・管理者のアカウント設定
ユーザ側の認証画面をusersとし、管理者側の認証画面をadminsとします。
/*-------------------------------- アカウントの種類 ---------------------------------*/ 'guards' => [ // 追加(ユーザー用) 'user' => [ 'driver' => 'session', 'provider' => 'users', ], //追加(管理者用) 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ],
会員ログインのための users と管理者ログインのための admins の2つを定義します。
どちらもセッションを使って、ログイン後の画面をプロテクトします。
/*---------------------------------
認証プロバイダー
----------------------------------*/
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],
// 追加(管理者用)
'admins' => [
'driver' => 'eloquent',
'model' => App\Admin::class,
],
],
使用するモデルを定義します。
エロクエントモデルが認証のための情報提供元となります。
/*--------------------------------- パスワードリセット時設定 ----------------------------------*/ 'passwords' => [ 'users' => [ 'provider' => 'users', 'email' => 'auth.emails.password', 'table' => 'password_resets', 'expire' => 60, ], // 追加(管理者用) 'admin' => [ 'provider' => 'admins', 'email' => 'adminAuth.emails.password', 'table' => 'password_resets', 'expire' => 60, ], ],
・provider -> 上述した通り、使用するモデル。
・email -> 再設定メールの本文のviewファイルを指定
・table -> パスワードリセットに使用するテーブル
・expire -> メールを受け取ってから、パスワード再設定可能な時間(分)
【3】管理者用のモデルの作成
管理者用のDBテーブル(admins)を操作するためのモデルを作ります。
/app/User.phpをコピーしてUserをAdminに変更します。
<?php
namespace App;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable
{
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
}
【4】管理者用コントローラの作成
管理者用のコントローラを作成します。
ここでも基本ユーザー用のコントローラを流用します。
app/Http/Auth(ユーザー用) のフォルダを丸ごとコピー し app/Http/AdminAuth(管理者用)にします。
管理者用のコントローラのフォルダには
1) AuthController.php
2) PasswordController.php
の二つがあるのでそれぞれ管理者用に編集していきます。
さらに/app/Http/HomeController.phpをコピーして
3) AdminHomeController.phpを作成します。
1) AuthController.php
/app/Http/AdminAuth/AuthController.php を編集します。
<?php
namespace App\Http\Controllers\AdminAuth; //名前空間のパスを変更
use App\Admin;
use Validator;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ThrottlesLogins;
use Illuminate\Foundation\Auth\AuthenticatesAndRegistersUsers;
class AuthController extends Controller
{
use AuthenticatesAndRegistersUsers, ThrottlesLogins;
protected $guard = 'admin'; // 使用するガードの種別
protected $redirectTo = '/admin/home'; // ログイン(および新規登録)後の飛び先。
protected $loginView = 'adminAuth.login'; // ログインビューの指定
protected $registerView = 'adminAuth.register'; // 新規登録ビューの指定
protected $redirectAfterLogout = '/multi_auth'; //ログアウト後のリダイレクト先
public function __construct()
{
$this->middleware($this->guestMiddleware(), ['except' => 'logout']);
}
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:admins',
'password' => 'required|confirmed|min:6',
]);
}
protected function create(array $data)
{
return Admin::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
]);
}
}
ユーザ側のコントローラ(Auth/AuthController.php)も必要に応じて「ログイン後のリダイレクト先」「ログアウト後のリダイレクト先」を設定します。
2) PasswordController.php
次にパスワードをリセットするコントローラを編集します。
<?php
namespace App\Http\Controllers\AdminAuth; //名前空間変更
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\ResetsPasswords;
class PasswordController extends Controller
{
use ResetsPasswords;
protected $redirectTo = '/admin/home'; //パスワード再設定後の飛び先
protected $linkRequestView = 'adminAuth.passwords.email'; //パスワードリセット用のビューの場所を指定。
protected $resetView = 'adminAuth.passwords.reset';
protected $guard = 'admin'; //ガードの種別指定。
protected $broker = 'admins'; //config/auth.php内で指定したpasswordの種別を指定。
public function __construct()
{
$this->middleware('guest:admin'); //guestミドルウェアのガードにadminを指定
}
}
guestミドルウェアは、ログインしてない場合、ログインページに強制移動させるミドルウェアです。
3) AdminHomeController.php
/app/Http/HomeController.php から /app/Http/AdminHomeController.php を作成します。
<?php
namespace App\Http\Controllers;
use App\Http\Requests;
use Illuminate\Http\Request;
class AdminHomeController extends Controller
{
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('auth:admin'); //authミドルウェアにadminガードを指定
}
/**
* Show the application dashboard.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('admin.home');
}
}
authミドルウェアは、ログインしている場合、$redirectToのページに強制移動させるミドルウェアです。
【5】管理者用ミドルウェアの編集
管理者でログインしていない場合とログインしている場合の処理を記述します。
1)ログインしていない処理・・・app/Http/Middleware/Authenticate.php
2)ログインしているときの処理・・・/app/Http/Middleware/RedirectIfAuthenticated.php
1)ログインしていない処理(Authenticate.php)
/app/Http/Middleware/Authenticate.php を修正します。
このミドルウェアが設定されていると、 ログインしていない場合にログイン画面にリダイレクトされます。
:(※中略)
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->guest()) {
if ($request->ajax()) {
return response('Unauthorized.', 401);
} else {
// 管理者用
if($guard == 'admin'){
return redirect()->guest('/admin/login');
}
return redirect()->guest('login');
}
}
return $next($request);
}
:(※中略)
2)ログインしているときの処理(RedirectIfAuthenticated.php)
/app/Http/Middleware/RedirectIfAuthenticated.php を修正します。
このミドルウェアが指定されていると、 ユーザーがログインしている場合に特定のページにリダイレクトされます。
:(※中略)
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
// 管理者用
if($guard == 'admin'){
return redirect('/admin/home/');
}
return redirect('/home/');
}
return $next($request);
}
:(※中略)
【6】管理者用ルーティング設定
Route::auth();で生成されるルートは vendor/laravel/framework/src/Illuminate/Routing/Router.php に記述されています。
管理者用のルーティングはこれを一部修正したものになります。
/*
* マルチ認証
*/
/*
* 共用(ユーザー・管理者)
*/
Route::get('/multi_auth', function () {
return view('multi_auth');
});
/*
* ユーザー
*/
Route::auth();
Route::get('/home', 'HomeController@index');
/*
* 管理者
*/
Route::get('/admin/home','AdminHomeController@index');
$this->get('admin/login', 'AdminAuth\AuthController@showLoginForm');
$this->post('admin/login', 'AdminAuth\AuthController@login');
$this->get('admin/logout', 'AdminAuth\AuthController@logout');
$this->get('admin/register', 'AdminAuth\AuthController@showRegistrationForm');
$this->post('admin/register', 'AdminAuth\AuthController@register');
$this->get('admin/password/reset/{token?}', 'AdminAuth\PasswordController@showResetForm');
$this->post('admin/password/email', 'AdminAuth\PasswordController@sendResetLinkEmail');
$this->post('admin/password/reset', 'AdminAuth\PasswordController@reset');
【7】管理者用ビュー作成
artisanコマンドのmake:authで自動生成された/resources/views/authをコピーしてadminAuthにリネームします。
各ファイルに記述されているパスの頭に/adminを追加します。
また /resources/views/home.blade.php から /resources/views/admin/home.blade.php を作成します。
これでLaravel5.2のマルチ認証ができます。
以上です。
仕事で Laravel を使っています。気づいたことや新しい発見など情報を発信していきます。問い合わせはこちら。

