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

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

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

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

PHP

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

解決済

Laravel6:ログイン認証後、別画面に遷移したいがログイン画面にリダイレクトする

yoriyori
yoriyori

総合スコア0

Laravel

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

PHP

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。

3回答

0評価

0クリップ

3197閲覧

投稿2021/01/13 12:52

編集2021/01/14 11:42

前提・実現したいこと

ログイン認証後、別画面(mypage)に遷移したいがログイン画面にリダイレクトしてしまいます。
ログインは成功しています。

ログにセッションの情報などを出力する限り、下記のような状況です。
0. ログイン画面で、ユーザーの認証成功
⇒ セッションに認証情報あり
0. 別画面にリダイレクト
⇒ セッションに認証情報なし
0. 認証情報がないため、ログイン画面にリダイレクト

セッション情報の引継ぎ(?)ができればよいのではないかと思うのですが、方法わからず。ご助言いただければ大変助かります。

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

エラーメッセージは表示されていません

該当のソースコード

  • web.php ルーティング

php

Route::namespace('Member')->prefix('member/')->name('member.')->group(function () { // ログイン認証関連 Auth::routes([ 'register' => true, 'reset' => true, 'verify' => false ]); // ログイン認証済みルート Route::middleware('auth')->group(function () { Route::resource('mypage', 'MypageController', ['only' => 'index']); });
  • LoginController.php : ログイン画面のコントローラ

php

class LoginController extends Controller { use AuthenticatesUsers; //mypageのパス protected $redirectTo = RouteServiceProvider::MEMBER_HOME; public function __construct() { $this->middleware('guest')->except('logout'); } //認証する権限を指定 protected function guard() { return Auth(); } }
  • MypageController.php : ログイン後の遷移先のコントローラ

__construct内でAuth::check()を行った結果、ログには『__constructログイン認証:NG』が出力され、indexは呼び出しがされません。

php

class MypageController extends Controller { public function __construct() { if (Auth::check()) { Log::debug(__CLASS__.'.'.__FUNCTION__.'__constructログイン認証:OK'); } else { Log::debug(__CLASS__.'.'.__FUNCTION__.'__constructログイン認証:NG'); } //web.phpで設定されてるため、ここでは設定する必要ない? //記載の有無にかかわらず、挙動は変わらない //$this->middleware('auth'); } //初期表示 public function index(Request $request) { if (Auth::check()) { Log::debug(__CLASS__.'.'.__FUNCTION__.'ログイン認証:OK'); } else { Log::debug(__CLASS__.'.'.__FUNCTION__.'ログイン認証:NG'); } return view('mypage');     //return view('crm.member.mypage'); //実際にはコメントアウトしたものを設定していますが、全体的に見やすくなるようディレクトリの情報は記載を削除しています } }
  • auth.php

ユーザー情報格納用テーブルをデフォのuser から別のテーブルに変更

php

'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\Member::class, ], ],

※2021/01/14追記

  • App\Models\Member.php

Authenticatableをextends

php

class CrmMember extends Authenticatable { use Notifiable; // /** * The table associated with the model. * * @var string */ protected $table = 'members'; /** * Get the password for the user. * * @return string */ public function getAuthPassword() { return $this->password; } protected $guarded = [ "deleted_at" ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ 'password', 'remember_token', ];
  • 2020_11_25_080337_create_members_table.php

マイグレーションファイル

php

class CreateCrmMembersTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::create('members', function (Blueprint $table) { $table->bigIncrements('id'); $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->nullable(); $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))->nullable(); $table->softDeletes(); $table->tinyInteger('created_class')->nullable(); $table->tinyInteger('updated_class')->nullable(); $table->tinyInteger('deleted_class')->nullable(); $table->string('created_id', 255)->nullable(); $table->string('updated_id', 255)->nullable(); $table->string('deleted_id', 255)->nullable(); $table->tinyInteger('test_account_flg')->default(0); $table->tinyInteger('registration_flg')->default(0); $table->integer('member_id')->nullable(); $table->string('password', 255)->nullable(); $table->string('last_name', 25)->nullable(); $table->string('first_name', 25)->nullable(); $table->string('member_mail', 100)->index('member_mail')->nullable(); $table->date('birthday')->nullable(); $table->tinyInteger('sex')->index('sex')->nullable(); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::dropIfExists('crm_members'); } }

試したこと

  • web.phpに記載している下記の内容を

php

Route::middleware('auth')->group(function () { Route::resource('mypage', 'MypageController', ['only' => 'index']); });

下記に変えてもNG

php

Route::resource('mypage', 'MypageController', ['only' => 'index'])->middleware('auth');

下記の場合はOKだったのでページ自体や記載の仕方には問題がなさそう。

php

Route::resource('mypage', 'MypageController', ['only' => 'index']);
  • 各ファイルに不要なスペースがないか確認

 行頭ファイルの先頭にスペースがある場合、ルーティングが正しく行われないことがあるとの情報があったので確認しました(漏れがあるかもしれません)

  • laravel/ui、npmを入れなおして再作成

※2021/01/14 追記
ログインを試行した際のsessionテーブルの情報を抽出したものになります(last_activityの昇順、項目は抜粋。
調査がしやすそうだったため、file管理ではなくDB管理に変更しています。
file管理をしていた際も複数のsession file が作成されており、出力された内容を見る限り同様の挙動をしているように見えました)

レコードは複数生成されているものの、user_idがセットされているレコードは1件のみです。
ログイン自体が失敗しているなら2行目のレコードは発生しない、
ログインが成功しているならば、3,4行目の情報が生成されず2行目のレコードのlast_activityが更新されていく…ような挙動になるのではないかと考えているのですが…

|user_id|last_activity|推測
|:--|:--:|
||2021/01/14 19:29:40|ログイン画面を初期表示した際のもの?
|6|2021/01/14 19:29:48|認証成功時に作成?
||2021/01/14 19:29:50|ログイン後に別画面にリダイレクトした際に生成?
||2021/01/14 19:29:51|ログイン画面に遷移した際に生成?

sql

SELECT user_id , cast(FROM_UNIXTIME(last_activity) as DATETIME) FROM sessions ORDER BY cast(FROM_UNIXTIME(last_activity) as DATETIME) desc

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

Laravel6
PHP7.4
Docker/nginx:1.15.6

Laravelが提供する認証機能を用いて作成しています。
'composer require laravel/ui "^1.0" --dev'
'php artisan ui vue --auth'

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Laravel

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

PHP

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

ログイン

ログインは、ユーザーがコンピューターシステムにアクセスするプロセスの事を呼びます。