🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Laravel

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

PHP

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

Q&A

解決済

2回答

1273閲覧

Middlewareクラス内でPassportで認証したユーザー情報を取得したい

sakura_hana

総合スコア11427

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/02/10 01:32

Laravel6を使用しています。まだローカル環境での開発中です。

◆やりたいこと
アプリと接続するAPIを作成しています。
全てのAPI接続時に統一のログを取る為、Middlewareのクラスを作成しました。
この部分でPassportで認証したユーザー情報を取得したいです。

PHP

1// Middleware/CheckAccess.php 2<?php 3 4namespace App\Http\Middleware; 5use Illuminate\Support\Facades\Log; 6use Closure; 7 8/** 9 * 毎回の通信で行う処理 10 */ 11class CheckAccess 12{ 13 /** 14 * APIにアクセスされた時の処理 15 * 16 * @param \Illuminate\Http\Request $request 17 * @param \Closure $next 18 * @return mixed 19 */ 20 public function handle($request, Closure $next) 21 { 22 // ↓常にNullになる 23 var_dump($request->user()); 24 25 // こんな感じでアクセスしたユーザー情報のログを残したい 26 //(このまま動かすと$request->user()がnullなのでエラーになる) 27 Log::info('access:'.$request->user()->id); 28 29 // その他に渡された値のチェック等も行う予定 30 31 $response = $next($request); 32 33 return $response; 34 } 35}

PHP

1// routes/api.php 内部 2Route::group(['middleware' => ['auth:api']], function () { 3 Route::post('/sample', 'SampleController@sample'); 4}); 5

PHP

1// app/Http/Kernel.php 内部 2protected $middleware = [ 3 // 前略 4 \App\Http\Middleware\CheckAccess::class, //←追加 5];

◆できていること
SampleControllerの処理中では$request->user()が正しく取得できています。
CheckAccessにて$request->user()を含まないログを指定した場合は正しくログ書き出しができています。

◆質問
CheckAccessを通過する段階ではまだ認証が行われていないのかなと思いますが、どのように修正すればいいか分かりません。
Middlewareを使用すること自体正しいのか分かっていないレベルなのですが、ご回答頂ければ助かります。

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下のようにするとどうでしょうか。

  • Kernel.phpでは、$middlewareではなく$routeMiddlewareの方にミドルウェアを追加
  • api.phpでは、'auth:api'の後ろにミドルウェアを指定

routes/api.php

php

1Route::group(['middleware' => ['auth:api', 'check']], function () { 2 Route::post('/sample', 'SampleController@sample'); 3});

app/Http/Kernel.php

php

1protected $routeMiddleware = [ 2 ... 3 'check' => \App\Http\Middleware\CheckAccess::class, // 例えば'check'という名前にする場合 4 ... 5];

参考:

投稿2021/02/16 01:21

編集2021/02/16 01:28
Lulucom

総合スコア1899

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

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

sakura_hana

2021/02/16 07:56

この方法で動作しました。ありがとうございます。 ログ記録とユーザーデータ判定の両方がやりたかった為にこちらの方法を探していましたが、別回答で頂いたスコープ、ゲート、ポリシーも参考になりました。要件に応じた実装を検討してみます。
Lulucom

2021/02/16 07:58

やりたかったことを実現されたようでよかったです。
guest

0

$next($request) の後に取得するのはどうでしょうか。

php

1 public function handle($request, Closure $next) 2 { 3 $response = $next($request); 4 5 var_dump($request->user()); 6 7 Log::info('access:'.$request->user()->id); 8 9 return $response; 10 }

投稿2021/02/12 02:20

Lulucom

総合スコア1899

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

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

sakura_hana

2021/02/16 00:44

返信遅れてすみません。 「$next($request);」の前処理として実行したいのですが、不可能でしょうか? 例ではログ表示だけですが、実際はUserの持つパラメータによる条件分岐をして先のコントローラーに行く前にエラーとして弾く等の仕組みを考えています。
Lulucom

2021/02/16 03:38

> Userの持つパラメータによる条件分岐をして先のコントローラーに行く前にエラーとして弾く これを一番実現されたい、ということでしたら、ミドルウェアではなく「認可」について検討されると良いかと感じました。認可では具体的にはGateまたはPolicyを作成することになります。 [認可]( https://readouble.com/laravel/6.x/ja/authorization.html )
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問