【Laravel】ユーザーの新規登録を制限する

とあるアプリで、自由にユーザー登録をさせたくない場合があったので、実装内容を記録しておきます。LaravelのAuth関連のルーティングをカスタマイズして、ユーザーの新規登録を制限してみます。

前提

Laravel6、7
ログイン機能をすでに実装しているものとします。

ログイン機能の実装については、↓

【Laravel6.0】ログイン機能を実装(ついでに日本語化)

新規登録を完全に無効にしたい場合

ユーザーの新規登録を完全に禁止にして登録させたくない場合です。

これは簡単で、以下のようにルーティングを書けばOKです。

Auth::routes(); // ←これを
Auth::routes(['register' => false]); // ←こう書き換える

各ページの新規登録ボタンはこれによって表示されなくなります。

新規登録を簡易的に制限したい場合

一般ユーザーには新規登録はさせたくないけど、特定のユーザーのみ登録ができるようにする方法です。

今回は、新規登録の機能は有効のままで、「新規登録ボタンの削除」と「URLの変更」で、ユーザーの新規登録を制限します。URLを知らないと新規登録ができないという少しゆるめの制限です。しっかり制限したい場合は、別の方法をとってください。

新規登録ボタンの削除

まず、新規登録ページへのリンクをすべて削除します。

Auth関連のファイル

resources/views/auth/login.blade.php
resources/views/layouts/app.blade.php

上記ファイル内の新規登録ボタンの削除。
その他、新規登録ページへのリンクがある場合は、すべて削除します。

URLの変更

新規登録ボタンを削除すれば、登録ページへは行けなくなりますが、デフォルトのルーティングのままだと、「○○/register」というURLなので、推測されてアクセスされてしまうので、URLを変更します。

ルーティングのカスタマイズ

Auth関連のルーティングは以下の一行で実装されています。

routes/web.php
Auth::routes();

これを無効にして、すべてのAuth関連のルーティングを設定し直す必要があります。

とは言っても、Laravel6、7の場合は以下の通りに書けばOKです。

routes/web.php
//Auth::routes(); // ←無効にする

//新規登録
Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('register', 'Auth\RegisterController@register');

//ログイン
Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
Route::post('login', 'Auth\LoginController@login');

//ログアウト
Route::post('logout', 'Auth\LoginController@logout')->name('logout');

//パスワードリセット
Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
Route::post('password/reset', 'Auth\ResetPasswordController@reset')->name('password.update');

//メール認証も実装している場合は以下も追加
Route::get('email/verify', 'Auth\VerificationController@show')->name('verification.notice');
Route::get('email/verify/{id}/{hash}', 'Auth\VerificationController@verify')->name('verification.verify');
Route::post('email/resend', 'Auth\VerificationController@resend')->name('verification.resend');

この新規登録のルーティングの部分を以下のようにカスタマイズします。

routes/web.php
//新規登録(カスタムURL)
Route::get('[ここに任意の文字列]', 'Auth\RegisterController@showRegistrationForm')->name('register');
Route::post('[ここに任意の文字列]', 'Auth\RegisterController@register');

好きな文字列を設定して新規登録URLを変更します。より複雑な文字列の方が安全です。

まとめ

以上で、一般ユーザーの新規登録の制限ができたと思います。ユーザー登録させたい特定のユーザーには、設定した文字列のURLを教えてあげれば、通常通りユーザー登録ができます。ただ、URLを知った人はすべて登録ができてしまうので、もっと厳密に制限したい場合は別の方法をとる必要があります。