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

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

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

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

PHP

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

ログイン

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

Q&A

解決済

3回答

5513閲覧

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

yoriyori

総合スコア0

Laravel

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

PHP

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

ログイン

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

0グッド

0クリップ

投稿2021/01/13 12:52

編集2021/01/14 11:42

前提・実現したいこと

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

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

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

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

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

該当のソースコード

  • web.php ルーティング

php

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

php

1class LoginController extends Controller 2{ 3 use AuthenticatesUsers; 4 //mypageのパス 5 protected $redirectTo = RouteServiceProvider::MEMBER_HOME; 6 7 public function __construct() 8 { 9 $this->middleware('guest')->except('logout'); 10 } 11 //認証する権限を指定 12 protected function guard() 13 { 14 return Auth(); 15 } 16}
  • MypageController.php : ログイン後の遷移先のコントローラ

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

php

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

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

php

1 'providers' => [ 2 'users' => [ 3 'driver' => 'eloquent', 4 'model' => App\Models\Member::class, 5 ], 6 ],

※2021/01/14追記

  • App\Models\Member.php

Authenticatableをextends

php

1class CrmMember extends Authenticatable 2{ 3 use Notifiable; 4 // 5 6 /** 7 * The table associated with the model. 8 * 9 * @var string 10 */ 11 protected $table = 'members'; 12 13 /** 14 * Get the password for the user. 15 * 16 * @return string 17 */ 18 public function getAuthPassword() 19 { 20 return $this->password; 21 } 22 23 protected $guarded = [ 24 "deleted_at" 25 ]; 26 27 /** 28 * The attributes that should be hidden for arrays. 29 * 30 * @var array 31 */ 32 protected $hidden = [ 33 'password', 'remember_token', 34 ];
  • 2020_11_25_080337_create_members_table.php

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

php

1class CreateCrmMembersTable extends Migration 2{ 3 /** 4 * Run the migrations. 5 * 6 * @return void 7 */ 8 public function up() 9 { 10 Schema::create('members', function (Blueprint $table) { 11 $table->bigIncrements('id'); 12 $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'))->nullable(); 13 $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'))->nullable(); 14 $table->softDeletes(); 15 $table->tinyInteger('created_class')->nullable(); 16 $table->tinyInteger('updated_class')->nullable(); 17 $table->tinyInteger('deleted_class')->nullable(); 18 $table->string('created_id', 255)->nullable(); 19 $table->string('updated_id', 255)->nullable(); 20 $table->string('deleted_id', 255)->nullable(); 21 $table->tinyInteger('test_account_flg')->default(0); 22 $table->tinyInteger('registration_flg')->default(0); 23 $table->integer('member_id')->nullable(); 24 $table->string('password', 255)->nullable(); 25 $table->string('last_name', 25)->nullable(); 26 $table->string('first_name', 25)->nullable(); 27 $table->string('member_mail', 100)->index('member_mail')->nullable(); 28 $table->date('birthday')->nullable(); 29 $table->tinyInteger('sex')->index('sex')->nullable(); 30 }); 31 } 32 33 /** 34 * Reverse the migrations. 35 * 36 * @return void 37 */ 38 public function down() 39 { 40 Schema::dropIfExists('crm_members'); 41 } 42}

試したこと

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

php

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

下記に変えてもNG

php

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

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

php

1Route::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

1SELECT 2 user_id 3 , cast(FROM_UNIXTIME(last_activity) as DATETIME) 4FROM 5 sessions 6ORDER BY 7 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'

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

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

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

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

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

guest

回答3

0

自己解決

解決方法見つからず、下記の方法で対応して解決いたしました。
結局原因は不明です…。

・一から環境を作り直し

ご助言くださった方、ありがとうございました。

投稿2021/01/25 07:42

編集2021/01/25 07:49
yoriyori

総合スコア0

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

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

0

一部間違えてたので修正します。

下記部分がログイン後の遷移先です。
app\Http\Controllers\Auth\LoginController.php

protected $redirectTo = RouteServiceProvider::HOME;

で、 RouteServiceProviderを修正すればログイン後の遷移先変わります。
app\Providers\RouteServiceProvider

public const HOME = '/home';

public const HOME = '/crm/member/mypage';

多分こいうこと?

投稿2021/01/14 08:21

編集2021/01/14 09:35
kunugi

総合スコア16

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

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

kai0310

2021/01/14 08:29

RegisterControllerの記述が何についてか理解されていますか? Registerと書かれているのでどの様な処理かの検討はつくはず.
yoriyori

2021/01/14 10:19 編集

ご回答ありがとうございます。 記載を抜粋していたため、わかりにくくてすみません。 RouteServiceProvider.php には下記の通り設定を行っているため、リダイレクト先については問題ないのかなと思っております。 > public const CRM_MEMBER_HOME = 'crm/member/mypage'; MypageController.php の__construct 呼び出し時に、調査のためAuth::check()を行っておりますが、結果がfalse になります。(ここでtrue になればmypageに遷移ができる筈) MypageController.php の__construct の呼び出しが行われているため、その前段階のLoginは行えているものの MypageController.php に移動した時点で認証情報が引き継げていない(セットされていない)ことが問題ではないかと思っております。
guest

0

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

Route::...の前のスペース」という意味だったら間違いです。

php

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

これだったら、GETで書いてもいいのにな~と思いました。

PHP

1Route::get('mypage', 'MypageController@index');

ファイルが足りないのでこれくらいの回答しかできません。
以下のファイルのご提示をお願いします。

  • app\Models\Member.php
  • database\migrations\yyyy_mm_dd_hhiiss_create_members_table.php

投稿2021/01/13 13:10

編集2021/01/13 13:10
kyoya0819

総合スコア10429

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

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

yoriyori

2021/01/13 23:56

ご回答ありがとうございます。 > 行頭にスペースがある場合、ルーティングが正しく行われないことがあるとの情報があったので確認しました すみません、確認したのは行頭ではなくファイルの先頭(<?php の前)でした。 他にも確認した方がよい場所ありますでしょうか? > これだったら、GETで書いてもいいのにな~と思いました。 自分の書き方だと冗長ですね。ありがとうございます! > 以下のファイルのご提示をお願いします。 上記ファイルのソースも追記いたしました。 おわかりになるところがございましたら、ご指摘いただけますと助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問