laravel12.laravel_032
R e i - D r e a m
for Laravel
TOP > Laravel Ver.12 > 認証処理(カスタマイズ)
Guest
login

最終投稿日:2026年3月1日

カスタマイズによる独自認証処理
独自画面にカスタマイズ
色々コマンドを叩いてサクっと認証画面ができましたが、自由度が全くありませんよね?
ログイン、ログアウトの制御や、パスワードの保存方法等こちらの事情もあったりします。
ではこれ以降はガチのカスタマイズとなります。
まずはルーティング処理を破棄する必要がありますので、以下の様に編集します。
~\routes\web.php

Route::group(['middleware' => 'auth'], function(){
    Route::get('/home', [App\Http\Controllers\HomeController::class, 'index'])->name('home');
});

Route::get('/login', [App\Http\Controllers\Auth\LoginController::class, 'login'])->name('login');
Route::post('/login', [App\Http\Controllers\Auth\LoginController::class, 'authenticate'])->name('login');
Route::get('/logout', [App\Http\Controllers\Auth\LoginController::class, 'logout'])->name('logout');

フレームワーク認証制御『Auth::routes()』を削除しました。
更に『login』用(GET/POST)、『logout』用のルートを追加します。
次に「~\app\Http\Controllers\Auth\LoginController.php」を編集します。
LoginController.php

<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller {
    use AuthenticatesUsers;
    protected $redirectTo = '/home';

    public function __construct() {
        $this->middleware('guest')->except('logout');
        $this->middleware('auth')->only('logout');
    }
    // ログアウト処理
    public function logout(Request $request) {
        Auth::logout();
        $request->session()->invalidate();                                           // セッションを無効化
        $request->session()->regenerateToken();                               // CSRFトークンを再生成
        return redirect('login');                                                              // ログイン画面など任意のページにリダイレクト
    }
    // ログイン処理
    public function login(Request $request){
        return view('auth/login', ['title'=>'ログイン画面']);
~ 省略 ~
}

コンストラクタの設定
・非ログインユーザーは[logout]アクション以外使用可能
・ログインユーザーは[logout]アクションのみ使用可能
流れを見てみましょう
「home」へアクセスを試みると、「login」画面へリダイレクトされるのが確認できるハズです。
これは「home」画面が認証対象だからです。
それでは、登録した《ID|パスワード》でログインしてみましょう。
以下エラーになると思います。
 Method App\Http\Controllers\Auth\LoginController::authenticate does not exist.
原因は、認証処理である関数「authenticate」がないからです。
それでは認証処理もカスタマイズしていきましょう。
LoginController.php

//オーバーライド(認証処理)
public function authenticate(Request $request) {
    $email = $request->email;
    $password = $request->password;
    // バリデーション
    $credentials = $request->validate([
        'email' => ['required', 'email'],
        'password' => ['required'],
    ]);
    // 認証チェック
    if (Auth::attempt($credentials)) {
        // セッション再生成(セッション固定攻撃対策)
        $request->session()->regenerate();
        // 認証成功時のリダイレクト
        return redirect()->intended('index');
    }
    // 認証失敗時の処理
    return back()->withErrors([
        'email' => '認証情報が正しくありません。',
    ])->onlyInput('email');
}

認証方法は「メール」「パスワード」とし、バリデーションを設定しています。
認証チェックでは、バリデーションで受取った変数を引数にする事ができます。
 ※「ちょこっとカスタマイズ」で認証方法を「ユーザー名」にしている場合は戻してください
次のコードに注目してください。
 return redirect()->intended('index') この処理は、直接「ログイン画面」へ遷移した場合は「index画面」へリダイレクトし、
「home画面」に遷移しようとしたが非認証のため「ログイン画面」へ弾かれた場合は、認証後「home画面」へリダイレクトする処理となります。
要するに認証前に遷移したい画面が分かってる場合と分からない場合の処理で、分からない場合のリダイレクト先を指定します。
最後に認証が失敗した場合の処理となります。
失敗した場合は「メール」のバリデーションエラーとしてメッセージを設定しています。
また「onlyInput('email')」とする事で、メールの入力内容だけを保持させます。
それでは画面類もカスタマイズし独自画面にします。
~\resources\views\layouts\base.blade.php

<!DOCTYPE HTML>
    <HEAD>
        <TITLE>{{ $title }}</TITLE>
        <link rel="stylesheet" href="{{ asset('css/base_css.css') }}" />
    </HEAD>
    <BODY>
    @section('header')
        @include('layouts.header')
    @show
    @yield('content')
    @section('footer')
        @include('layouts.footer')
    @show
    </BODY>
</HTML>

header.blade.php

{{-- 共通ヘッダ --}}
<div style="height:100px;width:100%;text-align:center;background-color:#AAA;">
    共通ヘッダ<BR />
    ようこそ
        @auth {{ auth()->user()->name }} @else 無名 @endauth
    さん!!
</div>

footer.blade.php

{{-- 共通フッタ --}}
<div style="height:100px;width:100%;text-align:center;background-color:#AAA;">
    共通フッタ<BR />
</div>

~\auth\login.blade.php

@extends('layouts.base')
@section('content')
    {{ html()->form()->open() }}
        @error('email')
            <div class="text-danger">{{ $message }}</div>
        @enderror
        {{ html()->text('email', '', $errors) }}
        <BR />
        {{ html()->text('password', '', $errors) }}
        <BR /><BR />
        {{ html()->button('ログイン') }}
    {{ html()->form()->close() }}
@endsection

テンプレートの編集については、テンプレート(ビューの構造) の内容に基づいています。
以上でログイン画面までは完了しました。
いかがですか?
当初の100%フレームワーク出来合いの画面から、自身の作成した画面となりました。
これはフレームワークの制約に関係なく、完全に自由なログイン画面を作成する事が可能になったという事です!!
では、「home」画面もオリジナルにしてみましょう。
home.blade.php

@extends('layouts.base')
@section('content')
    ホーム
    <BR />
    {{ html()->a(route('logout'), 'LogOut') }}
@endsection

HomeController.php

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller {
    public function __construct() {
        //
    }
    public function index() {

        return view('home', ['title'=>'ホーム']);
    }
}

※「home」画面をオリジナルにしたので、ヘッダー画面に仕込んだ変数を渡す必要があります
最後に「LoginController.php」のメソッド「authenticate」の処理を少し修正します。
return redirect()->intended('index');

return redirect()->intended('home');
これで、認証の基本的なカスタマイズは完了です!!
以下画面遷移ができるハズです。
① 非ログイン状態から『home』画面へアクセスすると『login』画面にリダイレクト処理される。
② ログインすると『home』画面にリダイレクト処理される。
③ ログアウトすると『login』画面にリダイレクト処理される。
ユーザー登録
[artisan]コマンドから作成される認証処理は大量のソースを作成します。
これまでカスタマイズにより、オリジナルの画面を作成しましたが、使用していないソースも多々あります。
以下は認証関連ソースとして自動生成されたが使用していない一覧となります。
《コントローラ》
・\Auth\VerificationController.php
・\Auth\ConfirmPasswordController.php
・\Auth\ForgotPasswordController.php
・\Auth\RegisterController.php
・\Auth\ResetPasswordController.php
《ビュー》
・\resources\views\auth\_passwords
・\resources\views\auth\_verify.blade.php
・\resources\views\auth\_register.blade.php
何か余計なものまで不要としている様な。。
あ、ユーザーが「hoge_user」しか居ないっ!!
「RegisterController」まで不要リストに入れたため、ユーザーの新規登録が出来なくなりました。。
という事で、次はオリジナルの「新規登録画面」を作成します。
まずはルート設定をします。
「~\routes\web.php」に追記しますが、認証の影響外に設定する様にします。
Route::get('/newuser', [App\Http\Controllers\Auth\LoginController::class, 'newuser'])->name('newuser');
Route::post('/newuser', [App\Http\Controllers\Auth\LoginController::class, 'newuser'])->name('newuser');
次に「~\resources\views\auth\login.blade.php」にユーザー登録用リンクを作成します。
~\auth\login.blade.php

@extends('layouts.base')
@section('content')
    {{ html()->form()->open() }}
        @error('email')
            <div class="text-danger">{{ $message }}</div>
        @enderror
        {{ html()->text('email', '', $errors) }}
        <BR />
        {{ html()->text('password', '', $errors) }}
        <BR /><BR />
        {{ html()->button('ログイン') }}

        <BR /><BR />
        {{ html()->a(route('newuser'), '[新規ユーザー登録]') }}
    {{ html()->form()->close() }}
@endsection

次に「~\app\Http\Controllers\Auth\LoginController.php」にロジックを記述します。
 ※ 一旦GET遷移のみの処理を追記します。
~\Auth\LoginController.php

// ユーザー新規登録
public function newuser(Request $request) {
    if ($request->method == 'GET') {
        return view('auth/newuser', ['title'=>'ユーザー登録']);
    }
}

最後にビュー「~\resources\views\auth\newuser.blade.php」を作成します。
~\auth\newuser.blade.php

@extends('layouts.base')
@section('content')
    {{ html()->form('post', route('newuser'))->open() }}
        @error('email')
            <div class="text-danger">{{ $message }}</div>
        @enderror
        {{ html()->text('email', '', $errors) }}
        <BR />
        @error('password')
            <div class="text-danger">{{ $message }}</div>
        @enderror
        {{ html()->text('password', '', $errors) }}
        <BR /><BR />
        {{ html()->button('登録') }}
    {{ html()->form()->close() }}
@endsection

では『home』画面へアクセスしてみましょう。
非ログイン状態のため『login』画面へリダイレクトされたと思います。
そこに【新規ユーザー登録】リンクがあるので、クリックしてみましょう。
はい。無事に新規ユーザー登録画面に遷移できましたね。
それでは登録処理を追加します。
LoginController.php

use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Session;
~ 省略 ~
    // ユーザー新規登録
    public function newuser(Request $request) {
        if ($request->method() == 'GET') {
            return view('auth/newuser', ['title'=>'ユーザー登録']);
        }
else {
            // バリデーション
            $validated = $request->validate([
                'email' => ['required', 'unique:users'],
                'password' => 'required',
            ]);
            // ユーザー登録
            $userId = DB::table('users')->insert([
                'name' => 'test_user',
                'email' => $validated['email'],
                'password' => Hash::make($validated['password']),
            ]);
            // ログイン処理
            return $this->authenticate($request);
        }
    }

さぁこれでユーザーを増やせるハズです。
試しにメールアドレス「[email protected]」、パスワード「foo0000」で登録してみてください。
無事ログイン状態で『home』画面へ遷移できたハズです。
ログインしてコメントを残そう!!


きっぷる
きっぷる