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

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

ただいまの
回答率

87.50%

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 441

score 83

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 //変更 ModelAuthenticatable
{
    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>
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • Lulucom

    2021/03/10 23:48 編集

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

    キャンセル

  • mikeko0901

    2021/03/11 09:28 編集

    はい、/admin となっています!

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

    キャンセル

  • Lulucom

    2021/03/11 09:46 編集

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

    キャンセル

回答 1

checkベストアンサー

0

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/03/11 14:47

    ありがとうございます。
    自分用にコピペした際にはしょってしまっていました。

    <input type="hidden" name="guard" value="admins">

    を追記しましたらログインできました!

    キャンセル

  • 2021/03/11 14:48

    よかったです^ ^

    キャンセル

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

  • ただいまの回答率 87.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る