Laravelは、PHPでWebアプリケーションやAPIを簡単に構築できる人気のフレームワークです。
Laravelには、認証システムがデフォルトで含まれており、ユーザー認証を簡単に実装できます。
しかし、プロジェクトによっては、管理者とユーザーの異なる認証方法が必要になることがあります。
この記事では、Laravelでマルチ認証を実装する方法について説明します。
Laravelでマルチ認証を実装して、
管理者とユーザーの異なる認証方法を提供しましょう!
マルチ認証の準備
まず、新しいLaravelプロジェクトを作成し、必要なパッケージをインストールします。
次に、User
モデルとAdmin
モデルを作成し、それぞれのテーブルを設定します。
Admin
モデルのマイグレーションファイルを作成し、データベースに適用します。
php artisan make:model Admin -m
マルチ認証の準備は簡単ですね!
次に、管理者用の認証コントローラを作成しましょう。
管理者用マイグレーションファイルの編集
作成されたマイグレーションファイルを編集し、admins
テーブルの構造を定義します。
以下の例では、name
、email
、password
などの基本的なカラムを設定しています。
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateAdminsTable extends Migration
{
public function up()
{
Schema::create('admins', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
public function down()
{
Schema::dropIfExists('admins');
}
}
マイグレーションの実行
編集が完了したら、以下のコマンドを実行してマイグレーションを実行し、admins
テーブルをデータベースに作成します。
php artisan migrate
れで、管理者用のマイグレーションファイルの作成と編集が完了しました!
データベースにadmins
テーブルが作成され、管理者情報を保存できるようになります。
これを使用して、管理者用の認証機能を実装していきましょう。
管理者用認証コントローラの作成
管理者用の認証コントローラを作成し、ログイン・ログアウト機能を実装します。
php artisan make:controller Admin\Auth\LoginController
LoginController
に、AuthenticatesUsers
トレイトを使用し、必要なメソッドをオーバーライドしてカスタマイズします。以下は、一例です。
use Illuminate\Foundation\Auth\AuthenticatesUsers;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/admin/dashboard';
public function __construct()
{
$this->middleware('guest:admin')->except('logout');
}
protected function guard()
{
return Auth::guard('admin');
}
public function showLoginForm()
{
return view('admin.auth.login');
}
public function login(Request $request)
{
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string',
]);
if (Auth::guard('admin')->attempt($request->only('email', 'password'), $request->filled('remember'))) {
return redirect()->intended(route('admin.dashboard'));
}
return back()->withInput($request->only('email', 'remember'));
}
public function logout(Request $request)
{
$this->guard()->logout();
$request->session()->invalidate();
return $this->loggedOut($request) ?: redirect('/admin/login');
}
}
管理者用認証コントローラを作成しました!
次に、ミドルウェアを作成していきましょう。
ミドルウェアの作成
カスタムガードを使用するために、新しいミドルウェアを作成します。
php artisan make:middleware RedirectIfAuthenticated
新しく作成したミドルウェアで、リダイレクト先をカスタマイズします。
public function handle(Request $request, Closure $next, ...$guards) { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { return $guard === 'admin' ? redirect('/admin/dashboard') : redirect('/home'); } } return $next($request); }
ミドルウェアができました!
これで、認証済みのユーザーが適切なリダイレクト先に送られます。
カスタムガードの設定
config/auth.php
ファイルに新しいカスタムガードを追加しましょう。
この例では、admin
ガードを追加します。
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins',
],
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
次に、新しいユーザープロバイダを追加します。
これにより、admins
テーブルから管理者データを取得できます。
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\Models\User::class,
],
'admins' => [
'driver' => 'eloquent',
'model' => App\Models\Admin::class,
],
],
ここでカスタムガードを設定しました!
これで、管理者用のログイン機能が実装されます。
ルーティングの設定
次に、管理者用のルーティングを設定します。routes/web.php
ファイルに、以下のようにルートを追加します。
Route::prefix('admin')->namespace('Admin')->middleware('guest:admin')->group(function () { Route::get('/login', 'Auth\LoginController@showLoginForm')->name('admin.login'); Route::post('/login', 'Auth\LoginController@login'); Route::post('/logout', 'Auth\LoginController@logout')->name('admin.logout'); }); Route::middleware('auth:admin')->prefix('admin')->namespace('Admin')->group(function () { Route::get('/dashboard', 'DashboardController@index')->name('admin.dashboard'); });
ルーティングが設定されました!
これで、管理者用のログイン画面やダッシュボードにアクセスできます。
ビューの作成
最後に、管理者用のログイン画面を作成します。
resources/views/admin/auth/login.blade.php
ファイルを作成し、ログインフォームを追加します。
<!-- resources/views/admin/auth/login.blade.php -->
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card">
<div class="card-header">{{ __('Admin Login') }}</div>
<div class="card-body">
<form method="POST" action="{{ route('admin.login') }}">
@csrf
<div class="form-group row">
<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>
<div class="col-md-6">
<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>
@error('email')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<label for="password" class="col-md-4 col-form-label text-md-right">{{ __('Password') }}</label>
<div class="col-md-6">
<input id="password" type="password" class="form-control @error('password') is-invalid @enderror" name="password" required autocomplete="current-password">
@error('password')
<span class="invalid-feedback" role="alert">
<strong>{{ $message }}</strong>
</span>
@enderror
</div>
</div>
<div class="form-group row">
<div class="col-md-6 offset-md-4">
<div class="form-check">
<input class="form-check-input" type="checkbox" name="remember" id="remember" {{ old('remember') ? 'checked' : '' }}>
<label class="form-check-label" for="remember">
{{ __('Remember Me') }}
</label>
</div>
</div>
</div>
<div class="form-group row mb-0">
<div class="col-md-8 offset-md-4">
<button type="submit" class="btn btn-primary">
{{ __('Login') }}
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
これで管理者用のログイン画面が作成されました!
これでマルチ認証の実装がほぼ完了です。
まとめ
この記事では、Laravelで管理者とユーザーの異なる認証方法を実装する方法について説明しました。これにより、管理者とユーザーがそれぞれのダッシュボードにアクセスできるようになります。
Laravelでマルチ認証を実装することで、アプリケーションのセキュリティとユーザー体験を向上させることができます。
他のLaravelの記事
トビログではこれ以外にも多くのLaravelの記事を公開しています!ぜひご覧ください!
コメント