📌
【Laravel】最近学んだ認証についてのまとめ
最近学んだ認証関連のファイルについてのまとめ
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);
}
}
Discussion