前提・実現したいこと
ログイン認証後、別画面(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'
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。