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

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

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

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

Q&A

解決済

1回答

2311閲覧

Laravel9にて自作のログイン機能を作成したい。

matthewmasa

総合スコア14

Laravel

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

0グッド

0クリップ

投稿2022/11/06 07:10

前提

・Laravel9を利用。
・また、ログインする際はanswersテーブルに登録してあるアドレスとユーザーの名前で入力する。(仕様書にパスワードを利用すると書いていないなく、同時にuserテーブルは作成しない為)
・Laravel Breezeのパッケージを利用し、ログイン機能のみを利用する。
・ルーティングとしては/systemルートにてログインを行い、成功したら/system/indexパスへと遷移するようにする。

ここに質問の内容を詳しく書いてください。
Breezeのパッケージをカスタマイズしているのですが、ログイン時に参照するDBを(users→answersテーブルに)変更し、ログインが出来るようにしたいです。どうすればよろしいでしょうか?

実現したいこと

パッケージに元から備わっているUsersテーブルでなく、自作したAnswersテーブルを参照し、レコードに登録されている名前とアドレスでログインを行う。

発生している問題・エラーメッセージ

上記の状態でログインをしようとするとArgument #2($provider) must be of type Illuminate\Contracts\Auth\UseProvider, null given, callled in...

というエラーが出現し、トップページすら上記のエラーでスタックしてしまっている。

該当のソースコード

以下認証する関数のコードになります。

public function authenticate()
{
$this->ensureIsNotRateLimited();
if (! Auth::attempt($this->only('email', 'password'), $this->boolean('remember'))) {
RateLimiter::hit($this->throttleKey());

throw ValidationException::withMessages([ 'email' => __('auth.failed'), ]); } RateLimiter::clear($this->throttleKey()); } /** * Ensure the login request is not rate limited. * * @return void * * @throws \Illuminate\Validation\ValidationException */ public function ensureIsNotRateLimited() { if (! RateLimiter::tooManyAttempts($this->throttleKey(), 5)) { return; } event(new Lockout($this)); $seconds = RateLimiter::availableIn($this->throttleKey()); throw ValidationException::withMessages([ 'email' => trans('auth.throttle', [ 'seconds' => $seconds, 'minutes' => ceil($seconds / 60), ]), ]); } /** * Get the rate limiting throttle key for the request. * * @return string */ public function throttleKey() { return Str::lower($this->input('email')).'|'.$this->ip(); }

試したこと

https://zakkuri.life/laravel-auth-by-other-table のサイトを参考にconfig/auth.phpファイルを修正した。
・各種ルーティングの修正を行う。
ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

単純なログイン機能であるので、このようなパッケージを使わず自作のログイン方法でもっと簡単な方法があれば、教えていただきたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  • Laravel9.x
  • breeze1.14 デフォルトのphp artisan breeze:installでインストール。

answersのmigrationがこうだとすると

php

1 public function up() 2 { 3 Schema::create('answers', function (Blueprint $table) { 4 $table->id(); 5 $table->string('name'); 6 $table->string('email')->unique(); 7 $table->rememberToken(); 8 $table->timestamps(); 9 }); 10 }

Models/Answer.php

php

1use Illuminate\Database\Eloquent\Factories\HasFactory; 2use Illuminate\Database\Eloquent\Model; 3use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract; 4use Illuminate\Auth\Authenticatable; 5 6class Answer extends Model implements AuthenticatableContract 7{ 8 use HasFactory; 9 use Authenticatable; 10}

breezeのLoginRequest.php

php

1 /** 2 * Get the validation rules that apply to the request. 3 * 4 * @return array 5 */ 6 public function rules() 7 { 8 return [ 9 'email' => ['required', 'string', 'email'], 10 'name' => ['required', 'string'], 11 ]; 12 } 13 14 /** 15 * Attempt to authenticate the request's credentials. 16 * 17 * @return void 18 * 19 * @throws \Illuminate\Validation\ValidationException 20 */ 21 public function authenticate() 22 { 23 $this->ensureIsNotRateLimited(); 24 25 $answer = Answer::where('name', $this->name) 26 ->where('email', $this->email) 27 ->first(); 28 29 if ($answer) { 30 Auth::loginUsingId($answer->id, $this->boolean('remember')); 31 //これでもいい Auth::login($answer, $this->boolean('remember')); 32 } 33 34 if (! Auth::check()) { 35 RateLimiter::hit($this->throttleKey()); 36 37 throw ValidationException::withMessages([ 38 'email' => trans('auth.failed'), 39 ]); 40 } 41 42 RateLimiter::clear($this->throttleKey()); 43 }

login.blade.php
Passwordの箇所をnameに変更。

<!-- Name --> <div class="mt-4"> <x-input-label for="name" :value="__('Name')" /> <x-text-input id="name" class="block mt-1 w-full" type="text" name="name" :value="old('name')" required /> <x-input-error :messages="$errors->get('name')" class="mt-2" /> </div>

config/auth.php

php

1 'providers' => [ 2 'users' => [ 3 'driver' => 'eloquent', 4 'model' => App\Models\Answer::class, 5 ],

投稿2022/11/06 10:29

kawax

総合スコア10377

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

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

matthewmasa

2022/11/06 15:37

ありがとうございます! 今回は仕様書が固まっていない中でのご対応となりましたが、無事ログインすることが出来ました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問