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

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

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

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

PHP

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

解決済

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

3aki
3aki

総合スコア12

Laravel 6

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

PHP

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

1回答

0リアクション

1クリップ

214閲覧

投稿2022/08/12 13:45

前提

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

実現したいこと

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

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

AccountController.php

<?php namespace App\Http\Controllers; use App\Models\Account; use App\Http\Requests\AccountRequest; use App\Http\Requests\LoginRequest; use Exception; use Illuminate\Database\Eloquent\ModelNotFoundException; class AccountController extends Controller { public function login() { $account = new Account(); return view('account/login', compact('account')); } public function check(LoginRequest $request) { // 追加すること // ユーザー名が違うときのエラー // パスワードが違うときのエラー // ユーザー名とパスワードが一致したときのログイン処理 $account = Account::where('name', $request->name)->firstOrFail(); try { $account = Account::where('name', $request->name)->firstOrFail(); if ($account->password != $request->password) throw new Exception(); } catch (ModelNotFoundException $e) { // 例外時の処理 } return redirect("/account"); } (略) }

login.blade.php

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

php 8.1.6
Laravel 9.16.0
MySQL 8.0.29

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

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するなら前に書く意味ないです。前に書くなら初期化するべきです。
SurferOnWww

2022/08/12 23:26

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

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

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

2022/08/13 03:56

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

2022/08/13 03:59

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

2022/08/15 01:01

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

2022/08/15 01:20

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Laravel 6

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

PHP

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