カスタマイズによる独自認証処理
独自画面にカスタマイズ
ログイン、ログアウトの制御や、パスワードの保存方法等こちらの事情もあったりします。 ではこれ以降はガチのカスタマイズとなります。
まずはルーティング処理を破棄する必要がありますので、以下の様に編集します。
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');
更に『login』用(GET/POST)、『logout』用のルートを追加します。 次に「~\app\Http\Controllers\Auth\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]アクションのみ使用可能
これは「home」画面が認証対象だからです。
それでは、登録した《ID|パスワード》でログインしてみましょう。
以下エラーになると思います。
Method App\Http\Controllers\Auth\LoginController::authenticate does not exist. 原因は、認証処理である関数「authenticate」がないからです。
それでは認証処理もカスタマイズしていきましょう。
//オーバーライド(認証処理)
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')」とする事で、メールの入力内容だけを保持させます。 それでは画面類もカスタマイズし独自画面にします。
<!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>
{{-- 共通ヘッダ --}}
<div style="height:100px;width:100%;text-align:center;background-color:#AAA;">
共通ヘッダ<BR />
ようこそ
@auth {{ auth()->user()->name }} @else 無名 @endauth
さん!!
</div>
{{-- 共通フッタ --}}
<div style="height:100px;width:100%;text-align:center;background-color:#AAA;">
共通フッタ<BR />
</div>
@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」画面もオリジナルにしてみましょう。
@extends('layouts.base')
@section('content')
ホーム
<BR />
{{ html()->a(route('logout'), 'LogOut') }}
@endsection
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class HomeController extends Controller {
public function __construct() {
//
}
public function index() {
return view('home', ['title'=>'ホーム']);
}
}
⇒
return redirect()->intended('home');
以下画面遷移ができるハズです。
② ログインすると『home』画面にリダイレクト処理される。
③ ログアウトすると『login』画面にリダイレクト処理される。
ユーザー登録
これまでカスタマイズにより、オリジナルの画面を作成しましたが、使用していないソースも多々あります。
以下は認証関連ソースとして自動生成されたが使用していない一覧となります。
《コントローラ》
・\Auth\ConfirmPasswordController.php
・\Auth\ForgotPasswordController.php
・\Auth\RegisterController.php
・\Auth\ResetPasswordController.php
・\resources\views\auth\_verify.blade.php
・\resources\views\auth\_register.blade.php
あ、ユーザーが「hoge_user」しか居ないっ!!
「RegisterController」まで不要リストに入れたため、ユーザーの新規登録が出来なくなりました。。 という事で、次はオリジナルの「新規登録画面」を作成します。 まずはルート設定をします。
「~\routes\web.php」に追記しますが、認証の影響外に設定する様にします。
Route::post('/newuser', [App\Http\Controllers\Auth\LoginController::class, 'newuser'])->name('newuser');
@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
※ 一旦GET遷移のみの処理を追記します。
// ユーザー新規登録
public function newuser(Request $request) {
if ($request->method == 'GET') {
return view('auth/newuser', ['title'=>'ユーザー登録']);
}
}
@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
非ログイン状態のため『login』画面へリダイレクトされたと思います。
そこに【新規ユーザー登録】リンクがあるので、クリックしてみましょう。
はい。無事に新規ユーザー登録画面に遷移できましたね。 それでは登録処理を追加します。
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』画面へ遷移できたハズです。




