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

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回答

539閲覧

ログイン画面でのエラー解決

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel 6

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

PHP

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

0グッド

0クリップ

投稿2023/03/20 04:44

実現したいこと

ブログサイトのログイン画面作成中に起きたエラー解決

前提

PHP Laravelでログイン画面のエラーメッセージの作成中if文のところでエラーが起きてしまった。

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

Trying to get property 'password' of non-object

該当のソースコード

SessionController.php

php

1<?php 2 3namespace App\Http\Controllers; 4 5use Illuminate\Http\Request; 6use Illuminate\Support\Facades\Auth; 7use App\User; 8 9class SessionController extends Controller 10{ 11 public function create(){ 12 return view('session.create', [ 13 'title' => 'ログイン', 14 ]); 15 } 16 public function store(Request $request){ 17 $user = Auth::user(); 18 $id = Auth::id(); 19 $user = User::where('name', $request->name)->first(); 20 if($user->password !== $request->password){ 21 session()->flash('danger', 'ログインに失敗しました。'); 22 return redirect()->route('session.create'); 23 } 24 session()->put('user_id', $user->id); 25 return redirect()->route('posts.index'); 26 } 27 public function destroy(){ 28 session()->flush(); 29 return redirect()->route('session.create'); 30 } 31} 32

試したこと

20行目のif文の()の中が原因ということはわかっているのですが、どう変えればよいのかわかりません。

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

書き方が間違っているのは自分でも重々承知なのですがこの書き方でやる場合どのようにしたら良いのか教えていただけると幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーメッセージ「Trying to get property 'password' of non-object」は、オブジェクトが存在しない場合に発生します。
これは、$userオブジェクトが見つからない場合に発生する可能性があります。

User::where('name', $request->name)->first(); この行でユーザーが見つからない場合、$userはnullになります。
この場合、$user->passwordを呼び出すと、エラーが発生します。
ユーザーが見つからなかった場合の処理を追加して、エラーを解決しましょう。

public function store(Request $request){
$user = Auth::user();
$id = Auth::id();
$user = User::where('name', $request->name)->first();

// ユーザーが見つからない場合の処理 if (!$user) { session()->flash('danger', 'ユーザーが見つかりません。'); return redirect()->route('session.create'); } if($user->password !== $request->password){ session()->flash('danger', 'ログインに失敗しました。'); return redirect()->route('session.create'); } session()->put('user_id', $user->id); return redirect()->route('posts.index');

}

ただし、上記のコードはパスワードの比較が平文で行われており、セキュリティ上の問題があります。
LaravelではHash::check()を使用して、ハッシュ化されたパスワードと平文パスワードの比較が推奨されています。
そのため、以下のように修正してください。

use Illuminate\Support\Facades\Hash;

// ...

public function store(Request $request){
$user = Auth::user();
$id = Auth::id();
$user = User::where('name', $request->name)->first();

// ユーザーが見つからない場合の処理 if (!$user) { session()->flash('danger', 'ユーザーが見つかりません。'); return redirect()->route('session.create'); } // パスワードのハッシュをチェック if (!Hash::check($request->password, $user->password)) { session()->flash('danger', 'ログインに失敗しました。'); return redirect()->route('session.create'); } session()->put('user_id', $user->id); return redirect()->route('posts.index');

}

これでエラーが解決し、セキュリティ上の問題も解決されます。

投稿2023/03/20 07:48

quiz

総合スコア269

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

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

退会済みユーザー

退会済みユーザー

2023/03/20 09:39

ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問