ラボ > Laravel、Lumen:ユーザー認証関連

laravel8「ログインユーザー+任意の条件」で指定ページに飛ばしたい

ログイン後、絶対に登録させたい項目があるとき…など(※ミドルウェア(middleware)が絡む)

作成日:2022-12-01, 更新日:2023-09-20

私の環境

WIN+Docker+Ubuntuでlaravelを使うための作業メモ

メモ

コントローラの「__construct()」の中で対応しようとしたら「__construct()」の中で「Auth::user()」が使えないということが発覚
「__construct()」の中で使う方法もあるけど任意のページに飛ばす方法がよく分からず…思い出したのが以前に作業した「laravel8 任意のユーザーを強制ログアウトさせる」。

基本

laravel8 任意のユーザーを強制ログアウトさせる」と基本は同じ
→このファイルに条件を追加するのが良いと思うけど、勉強がてら別途作成

処理の流れ

  1. ミドルウェアの作成
  2. カーネルに登録
  3. 確認

ミドルウェアの作成

ファイルの作成

▼artisanコマンドでミドルウェアのファイル作成

$ ./vendor/bin/sail php artisan make:middleware CheckRequiredRegister

→「app/Http/Middleware/CheckRequiredRegister.php」が作られる

ファイルの修正

▼「app/Http/Middleware/CheckRequiredRegister.php」にuse追加

use Illuminate\Support\Facades\Auth;

▼「app/Http/Middleware/CheckRequiredRegister.php」の「handle()」

public function handle(Request $request, Closure $next)
{
    if( auth()->check() ){
        $user_id = auth()->user()->id;
        
        ~ $user_idから好きなデータを取得 ~
        
        if ( ~ ダメな条件 ~ ) {
            return redirect(~ 飛ばしたい場所 ~);
        }
    }
    return $next($request);
}

→飛ばし先によっては無限ループになるので注意する

無限ループになった例

▼ログイン後、「設定ページ」より諸々登録させたいので登録が無ければ「設定ページ」に飛ばそうとした

public function handle(Request $request, Closure $next)
{
    if( auth()->check() ){
        $redirect_url = url('setting'); // 「設定ページ」に飛ばす
        $user_id = auth()->user()->id;
        
        ~ $user_idから好きなデータを取得 ~
        
        if ( ~ ダメな条件 ~ ) {
            return redirect($redirect_url);
        }
    }
    return $next($request);
}

→「設定ページ」に飛んでくれるけど、「設定ページ」でもこのミドルウェアが実行されるので再度「設定ページ」にリダイレクト。これで無限ループの完成。

無限ループの回避

「設定ページ」のとき「チェックしない」ってのが必要

▼今回はURLで条件分岐

public function handle(Request $request, Closure $next)
{
    if( auth()->check() ){
        $redirect_url = url('setting'); // 「設定ページ」に飛ばす
        if ( $request->url() != $redirect_url  ) { // 現在のページと飛ばし先が異なるときだけチェック
            $user_id = auth()->user()->id;
            
            ~ $user_idから好きなデータを取得 ~
            
            if ( ~ ダメな条件 ~ ) {
                return redirect($redirect_url);
            }
        }
    }
    return $next($request);
}

→今回は単純に「!=」としたけど「strpos()」だったり、複数のURLの確認だったりとケースバイケース
※ルーティングにもよるけどログアウトが出来なくなるかもしれない → ログアウトのときもチェックしないようにする

カーネルに登録

▼「app/Http/Kernel.php」に追加

~ 省略 ~
protected $middlewareGroups = [
    'web' => [
        ~ 省略 ~
        \App\Http\Middleware\CheckRequiredRegister::class,
    ],

    'api' => [
        ~ 省略 ~
    ],
];
~ 省略 ~

※状況に応じて「api」のほうに追加したり、違うトコに記載したりする

「登録してね」的なメッセージを表示させたい

  • ミドルウェア側でセッションセット
  • リダイレクト先でセッション取得+出力

ミドルウェア側でセッションセット

▼「app/Http/Middleware/CheckRequiredRegister.php」の「handle()」

public function handle(Request $request, Closure $next)
{
    ~ 省略 ~
    return redirect(~ 飛ばしたい場所 ~)->with(array('ErrMessage'=>'登録してね'));
    ~ 省略 ~

    return $next($request);
}

リダイレクト先でセッション取得+出力

コントローラ

~ 省略 ~
use Illuminate\Http\Request;
~ 省略 ~
    public function xxx(Request $request){
        $viewData = array(
            'ErrMessage' => $request->session()->get('ErrMessage', ''),
        );
        return view('〇〇〇', $viewData);
    }
~ 省略 ~

ビュー

~ 省略 ~
@if($ErrMessage!='')
    {{ $ErrMessage }}
@endif
~ 省略 ~

確認

条件にあうログインユーザーでブラウザからアクセスして、対象ページにリダイレクトされたら成功

関連項目