Laravel:8.32.1
php7.4
こちらのサイトを参考に、マルチ認証の実装を試みました。
複数モデルでログインできるようにする
メールアドレスをパスワードは合っているはずですが、
認証に失敗しました と出ます。
どこが誤っているのか、ご教示いただけますと幸いです。
以下、記事を参考に変更した箇所です。
Admin というモデルでログインできるようにしました。
■Admin Model
app/Models/Admin.php
<?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Foundation\Auth\User as Authenticatable; //追加 class Admin extends Authenticatable //変更 Model⇒Authenticatable { use HasFactory; }
■adminsテーブルのマイグレーションファイル。こちらをmigrateしました。
<?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('email')->unique()->comment('メールアドレス'); $table->string('password')->comment('パスワード'); $table->rememberToken()->comment('ログイン省略トークン'); $table->integer('authority')->comment('権限'); $table->timestamps(); }); } ★以下省略
■Adminモデルに1件データを登録しました。
database/seeders/MultiAuthTableSeeder.php
<?php namespace Database\Seeders; use Illuminate\Database\Seeder; use App\Models\Admin; use Illuminate\Support\Facades\Hash; class MultiAuthTableSeeder extends Seeder { public function run() { $init_admins = [ [ 'email' => '★メールアドレスが入ってます★', 'password' => 'huncho0224', 'authority' => '1' ], ]; foreach($init_admins as $init_admin) { $admin = new Admin(); $admin->email = $init_admin['email']; $admin->password = Hash::make($init_admin['password']); $admin->authority = $init_admin['authority']; $admin->save(); } } }
※テーブルを確認しても、メールアドレスは想定したものが登録されていました。
パスワードはハッシュ化していました。
■Adminモデルでログインできるようにconfigファイルを変更
config/auth.php
<?php return [ 'defaults' => [ 'guard' => 'web', 'passwords' => 'users', ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', 'hash' => false, ], //adminを追加 'admins' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], // 'users' => [ // 'driver' => 'database', // 'table' => 'users', // ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, 'throttle' => 60, ], ], 'password_timeout' => 10800, ];
■ルート
routes/web.php
<?php use Illuminate\Support\Facades\Route; Route::get('/', function () { return view('welcome'); }); Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () { return view('dashboard'); })->name('dashboard'); /* マルチ認証 */ //ログイン Route::get('admin', [\App\Http\Controllers\MultiAuthController::class, 'showLoginForm']); Route::post('admin', [\App\Http\Controllers\MultiAuthController::class, 'login']); // ログイン後のページ Route::prefix('admin')->middleware('auth:admins')->group(function(){ Route::get('dashboard', function(){ return 'Adminでログイン完了'; }); });
■マルチ認証のためのコントローラー
app/Http/Controllers/MultiAuthController.php
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; class MultiAuthController extends Controller { public function showLoginForm() { return view('admin.login'); } public function login(Request $request) { $credentials = $request->only(['email', 'password']); $guard = $request->guard; if(\Auth::guard($guard)->attempt($credentials)) { return redirect($guard .'/dashboard'); // ログインしたらリダイレクト } return back()->withErrors([ 'auth' => ['認証に失敗しました'] ]); } }
■ログインページのview
resources/views/admin/login.blade.php
<html> <head> <link href="https://unpkg.com/tailwindcss@^1.0/dist/tailwind.min.css" rel="stylesheet"> </head> <body> <form method="POST" action="admin"> @csrf <div class="p-3"> @error('auth') <div class="bg-red-100 border border-red-400 text-red-700 px-4 py-3 rounded mb-3"> ⚠ {{ $message }} </div> @enderror <label class="block">メールアドレス</label> <input class="border rounded mb-3 px-2 py-1" type="text" name="email"> <label class="block">パスワード</label> <input class="border rounded mb-3 px-2 py-1" type="password" name="password"> <br> <button class="bg-blue-500 text-white rounded px-3 py-2" type="submit">ログイン</button> </div> </form> </body> </html>
回答1件
あなたの回答
tips
プレビュー