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

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

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

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

536閲覧

laravelでログイン機能を実装中で、エラー表示させるシステムがわかりません

3aki

総合スコア14

Laravel 6

Laravel 6は、オープンソースなPHPのフレームワーク。Webアプリケーションの開発に適しており、バージョン6はLTSです。5.8での向上に加えて、セマンティックバージョニングの採用やLaravel Vaporとのコンパチビリティなどが変更されています。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2022/08/12 13:45

前提

phpもlaravelも初めて触っています。
laravelでログイン機能を実装している最中なのですが、ログインに失敗した場合のエラー表示をどうすればできるのかが、全く見当がつかないでいます。

実現したいこと

ユーザーIDが未入力だったときのエラー表示。
パスワードが未入力だったときのエラー表示。
ユーザーIDが見つからなかったときのエラー表示。
パスワードが不一致だったときのエラー表示。
その他の原因によるエラー表示。

エラー検出をするタイミングはController.phpの中だというのはわかったのですが、どういう処理を書けばもとのログイン画面にエラー表示させることができるのか、調べる単語が悪いのか情報が出てこないので、教えていただきたいです。

AccountController.php

1<?php 2 3namespace App\Http\Controllers; 4 5use App\Models\Account; 6use App\Http\Requests\AccountRequest; 7use App\Http\Requests\LoginRequest; 8use Exception; 9use Illuminate\Database\Eloquent\ModelNotFoundException; 10 11class AccountController extends Controller { 12 13 public function login() { 14 $account = new Account(); 15 return view('account/login', compact('account')); 16 } 17 18 public function check(LoginRequest $request) { 19 // 追加すること 20 // ユーザー名が違うときのエラー 21 // パスワードが違うときのエラー 22 // ユーザー名とパスワードが一致したときのログイン処理 23 $account = Account::where('name', $request->name)->firstOrFail(); 24 try { 25 $account = Account::where('name', $request->name)->firstOrFail(); 26 if ($account->password != $request->password) 27 throw new Exception(); 28 } catch (ModelNotFoundException $e) { 29 // 例外時の処理 30 } 31 32 return redirect("/account"); 33 } 34(略) 35} 36

login.blade.php

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

php 8.1.6
Laravel 9.16.0
MySQL 8.0.29

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

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

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

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

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

jem32o

2022/08/12 14:06

これ「if ($account->password != $request->password)」がtrueの時「throw new Exception();」を実行して「catch」が通ると思うのですが、「catch」内は何もしないで「"/account"」にリダイレクトしているように見えます。 またエラーメッセージはどこで設定しているのでしょうか?
3aki

2022/08/12 14:09

その「catch」内になにを書けばいいのかや、エラーメッセージをどこで設定すればいいのかがわからないです。
jem32o

2022/08/12 14:33

そもそも「catch」自体理解してますか? エラーメッセージの内容の設定はあなたのファイル構成知らないので、他のメッセージと同じファイルに書くか新規に作ったファイルに書くでもいいと思います。 エラーメッセージはやり方は色々ありますが、「catch」内でエラーメッセージをセットしてredirect("/account")する際、セットしたエラーメッセージも併せて渡し、リダイレクト先のblade.php上にセットしたエラーメッセージを出力すればいいかと あと気になったのですが、「$account = Account::where('name', $request->name)->firstOrFail();」をtryの前と中の2回同じもの書いている意味あります? 外に書くならtry~catch する意味ないし、try~catchするなら前に書く意味ないです。前に書くなら初期化するべきです。
退会済みユーザー

退会済みユーザー

2022/08/12 23:26

本題とは直接関係ない話ですが、 > ユーザーIDが見つからなかったときのエラー表示。 >パスワードが不一致だったときのエラー表示。 その二つを区別して表示する (ユーザーに知らせる) のはセキュリティの問題があるので避けるべきです。
退会済みユーザー

退会済みユーザー

2022/08/12 23:38

質問者さんが自力で認証機能を実装しようとしているように見えますが、そうなんですか? Laravel にはフレームワーク組み込みの認証機能があるそうですのでそれを使ってはいかがですか? https://codezine.jp/article/detail/12920 初学者が自力で認証システムを実装するのは無理があります。
3aki

2022/08/13 03:06

try-catch節の仕組みはわかります。 エラーメッセージのやり方は色々あるとのことですが、その一例としてでも他ファイルからエラーメッセージを取り出して、それを「「catch」内でエラーメッセージをセットしてredirect("/account")する際、セットしたエラーメッセージも併せて渡し、リダイレクト先のblade.php上にセットしたエラーメッセージを出力」する方法を教えていただきたかったです。 すみません、「$account = Account::where('name', $request->name)->firstOrFail();」はtry-catch節をコピペしたときに消し忘れていました。
3aki

2022/08/13 03:07

差し支えなければそのセキュリティの問題がどのような問題なのか教えていただけませんか?
3aki

2022/08/13 03:11

はい、自力で認証機能を実装しようとしていましたが、その「フレームワーク組み込みの認証機能」の存在を知りませんでした。 「簡単にできるから認証画面から作ってみて」と指示されたものの、全然簡単に思えなくてもう何週間も経っていました。 こんな便利なものがあったのですね。教えていただきありがとうございます。
退会済みユーザー

退会済みユーザー

2022/08/13 03:56

> 差し支えなければそのセキュリティの問題がどのような問題なのか教えていただけませんか? 例えば、ID は OK だがパスワードだダメということが分かってしまうなど、攻撃者にヒントを与えるからです。
退会済みユーザー

退会済みユーザー

2022/08/13 03:59

> 「簡単にできるから認証画面から作ってみて」と指示されたものの ログイン画面を作るだけだったらそんなに難しくはないと思いますが、十分なセキュリティを保って認証システムの一つとして動かすのは非常に難しいことです。
3aki

2022/08/15 01:01

たしかに。利用者には不便ですけど、攻撃者にとっても不便でなくてはならないんですね。 いえ、ログイン画面を作るの難しいです。
退会済みユーザー

退会済みユーザー

2022/08/15 01:20

> ユーザーIDが未入力だったときのエラー表示。 > パスワードが未入力だったときのエラー表示。 と > ユーザーIDが見つからなかったときのエラー表示。 > パスワードが不一致だったときのエラー表示。 というレイヤーの違う検証を一緒にしてやろうとしているから、話がややこしくなっているように思えます。 前者は、たぶん、フレームワークにユーザー入力の検証機能が備わっていると思いますので、それを探して利用してはいかがですか? 洗練されたフレームワークなら、クライアント側とサーバー側の両方で検証するような仕組みを、ほとんどコードを書かないで実装できるものもあります。自分は Laraval は分かりませんが「laravel ユーザー入力 検証」とかでググるといろいろヒットしますので調べてみてはいかがですか? 後者はサーバー側で DB にアクセスして検証ということになるので、質問のコードのようなやり方になると思います。それもフレームワーク組み込みの機能を使いましょう。質問者さんのコードでは生のパスワードを DB に保存しているように見えますが、そうだとするとそこがまずセキュリティ的に問題です。まともなフレームワークならハッシュ、ソルト、ストレッチングを自動的にやってくれるはずです。 参考: 本当は怖いパスワードの話 https://atmarkit.itmedia.co.jp/ait/articles/1110/06/news154.html
guest

回答1

0

自己解決

「フレームワーク組み込みの認証機能」を知り解決

投稿2022/08/15 01:02

3aki

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問