質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Q&A

解決済

1回答

2405閲覧

Laravel マルチ認証でログインができない

mikeko0901

総合スコア227

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

0グッド

0クリップ

投稿2021/03/10 14:30

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"> &#x26A0; {{ $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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Lulucom

2021/03/11 00:48 編集

その「認証に失敗しました」が表示されているとき、ブラウザのアドレスバーのURLの最後は/adminですか?そのログインページは本当にマルチ認証のログインページかの確認です。(念のため) ご質問の際にはURLもわかるようにすると親切です。もしドメイン名などを公開したくなければその部分だけ画像から消す感じで。
mikeko0901

2021/03/11 00:32 編集

はい、/admin となっています! Hashのところはこのコードで合っていますでしょうか? Adminモデルにテスト用データを登録するところでは $admin->password = Hash::make($init_admin['password']); としていますが、 コントローラーMultiAuthController.phpのloginのところでは そのまま$credentialsに入れてしまっているので、本当にこれで合っているかな、、と少し気になりました。。
Lulucom

2021/03/11 00:54 編集

合っているように思います。 参考にされたサイトではフォームからguardの値も送信していますが、質問に書かれたフォームではguardの値を送信できていないためではないでしょうか。
guest

回答1

0

ベストアンサー

コントローラのloginメソッドでguardの値がnullになっているためではないでしょうか。

質問のログインページのフォームからはguardの値が送信されていませんが、参考にされたサイトのコードではguardの値も送信しています。同様にguardの値としてadminsを送信してみるとどうでしょうか。

(あるいは、loginメソッドの中で、リクエストからguardの値を受け取る代わりに、暫定的に固定でadminsを指定してみても良いかと思いました)

投稿2021/03/11 00:52

編集2021/03/11 04:05
Lulucom

総合スコア1899

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mikeko0901

2021/03/11 05:47

ありがとうございます。 自分用にコピペした際にはしょってしまっていました。 <input type="hidden" name="guard" value="admins"> を追記しましたらログインできました!
Lulucom

2021/03/11 05:48

よかったです^ ^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問