📌

【Laravel】最近学んだ認証についてのまとめ

2023/07/09に公開

最近学んだ認証関連のファイルについてのまとめ

Breezeを使っています。Lravel10.xです
ビギナーによるメモで雑ですんません

各々確認

確認するファイルたち。

  • Authenticated.php(Middleware/)
  • RedirectIfAuthenticated.php(Middleware/)
  • RouteServiceProvider.php(app/Providers)
  • web.php&auth.php(routes)
  • AuthenticatedSessionController.php(Http/Controllers/User/Auth)
  • TaskController.php(ログイン認証時のルート・コントローラ)

Authenticated.php(=未認証クライアントか?の検証をし、ルートを分岐させる) を確認

  • protected $user_route = "user.login";としていることでUPLがuserのときはuser.loginを返してあげる
Authenticated.php
use Illuminate\Support\Facades\Route;
class Authenticate extends Middleware
{
    //TODO: RouteServiceProviderで定義。RouteServiceProviderでasによってuserは"user."と先頭につけることを決めたので先頭にuser.をつけた
    protected $user_route = "user.login"; //未認証ならrouteをloginに返すことを決める
    // * 未認証の場合のリダイレクト
    protected function redirectTo(Request $request): ?string
    {
        if (! $request->expectsJson()) {
          //ルートがuserのときはuser.loginを返してあげる
            if(Route::is("user.*")){
                return route($this->user_route);
            }
        }
    }
}

RouteServiceProvider.phpの定義を確認(=土台となるroute自体を定義する)

  • 「/」がついたら「user」として認識する。これ以降はログインされているかどうかで挙動を制御する
  • routes/web.phpに詳しい制御を書く
RouteServiceProvider.php
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{
    public const HOME = '/';
    public function boot(): void
    {//色々割愛
        $this->routes(function () {
            // POINT:「/」がついたら「user」として認識する。これ以降はログインされているかどうかで挙動を制御する
            Route::prefix("/")
            ->as("user.")
            ->middleware("web")//このミドルウエアは基本web/apiです.カスタムするならKernelなどに追記しろ)(https://readouble.com/laravel/8.x/ja/middleware.html)
            ->namespace($this->namespace)
            ->group(base_path("routes/web.php"));
        });
    }
}

routes/web.php を確認

  • userで認証していたら/でTaskControllerの, 'index'を見にいく
  • 認証していなかったらguestのget::('login')あたりが呼ばれるのでAuthenticatedSessionControllerを見に行く
web.php
//色々割愛
Route::get('/', function () {
    return view('user.main');
});

Route::middleware("auth:users")->group(function(){
    // to商品一覧
    Route::get("/", [TaskController::class, 'index'])->name('tasks.index');
});
require __DIR__.'/auth.php';
route/auth.php
//ゲストユーザー
Route::middleware('guest')->group(function () {
    //ログインしていないユーザーはKernel.phpより、\App\Http\Middleware\RedirectIfAuthenticated,に紐づいている
    Route::get('login', [AuthenticatedSessionController::class, 'create'])
                ->name('login');//AuthenticatedSessionControllerのcreateメソッドを見る

    Route::post('login', [AuthenticatedSessionController::class, 'store']);
});

Route::middleware('auth:users')->group(function () {
  //ごり割愛
});

TaskController.php でログイン承認時にここに飛ばされたときに挙動を制御

  • __construct()にミドルウエアを噛ませることで、このコントローラを使う際に必ずガードが入るようになる
TaskController.php
class TaskController extends Controller
{
    public function __construct()
    {
        $this->middleware("auth:users");//userログインに限る

        $this->middleware(function ($request, $next) {
            return $next($request);
        });
    }

    public function index()
    {
        return view("user.index");
    }
}

AuthenticatedSessionController.php →getの時のルートで指定されたコントローラを確認

  • return view('user.auth.login');:resources/views/User/login.blade.php表示
AuthenticatedSessionController.php
class AuthenticatedSessionController extends Controller
{
    /**
     * Display the login view.
     */
    public function create(): View
    {
        return view('user.auth.login');
    }

RedirectIfAuthenticated.php で認証済みユーザーかどうか見て認証されていたらRouteServiceProviderで定義したところまで飛ばす

RedirectIfAuthenticated.php
//TODO: ログイン済みユーザーがアクセスしてきたらリダイレクト処理
class RedirectIfAuthenticated
{
    private const GUARD_USER = "users";
    public function handle(Request $request, Closure $next, string ...$guards): Response
    {
        // * ユーザーとして認証されていたら(check()メソッドで判定)、かつ、リクエストが"user.*"のURLだったら
        if(Auth::guard(self::GUARD_USER)->check() && $request->routeIs("user.*")){
            return redirect(RouteServiceProvider::HOME); //HOMEへ遷移できる
        }
        return $next($request);
    }
}
GitHubで編集を提案

Discussion