Laravel:管理者のみに新規ユーザー登録(register)を許可

Laravel:管理者のみに新規ユーザー登録(register)を許可

Laravel:register を管理者のみに限定にしたい

ずっと悩んでました。

今回のアプリは企業の基幹業務となる為、簡単にユーザー作られては困ります。
勝手にログインユーザー作られて、原価情報見られたなんて害しかありません。

と言うことで、ずっとregisterの振舞いを変えたかったのです。

でも、Auth関連はトレイトが多くどうすればいいかわからない。
【Illuminate\Foundation\】以降はあまり弄りたくないし…。

そんなこんなで後回しにしていましたが、やっと解決に至りました。

Laravelのバージョン情報取得

この記事を書くにあたり、様々なサイトで情報収集させていただきました。

管理者のみ新規ユーザー登録できるという構築の説明はLaravel5.2以前のものが多くHITし、お手本の通りにファイルが無い事もしばしば。その為、私の構築環境を明示しておきます。

php artisan -V

Laravel Famework 5.5.44 だそうです。

レジスター動作の要求事項

作成する仕組みは下記要項を満たすものとします。

  1. 未認証(GUEST)の 新規ユーザー登録をガードする
  2. 未認証(GUEST)が register にアクセスした時、Login画面にリダイレクト
  3. 全ての認証ユーザーは自分の登録情報の変更が出来る
  4. 全ての認証ユーザーは他ユーザーの情報(氏名とメールアドレスのみ)を閲覧できる
  5. 管理者ユーザーは新規ユーザー登録が出来る
  6. 一般ユーザーの新規ユーザー登録をガードする
  7. 管理者ユーザーは全ユーザーの情報を変更可能とする
  8. 管理者ユーザーは全ユーザーのパスワード再設定を行える
  9. Engineer権限は全ての情報のアクセス、変更、新規登録、削除を可能とする

前提条件として、Gate機能の実装を済ませたものとします。
※Gateの実装はここら辺(サイト1サイト2サイト3)を参考に構築できます。

最初に結論から

下記設定にすると登録ユーザーのみ新規ユーザー登録が出来るようになります。

\app\Http\Auth\RegisterController.php  39行目あたりのコンストラクト

\routes\web.php の Auth::routes(); を削除(コメントアウト)します。

Auth::routes(); は Laravel標準のAuth認証【laravel\vendor\laravel\framework\src\Illuminate\Routing\Router.php】を呼び出しています。

Route::group([‘middleware’ => [‘auth’, ‘can:admin’]], function () { hogehoge; }); はGateの設定が完了した後、adminで登録したユーザーに許可しますという関数になります。

ルートとログインのヘッダーからregisterを外すのを忘れない

上記設定が出来ていれば、Guestでregisterにアクセスした場合loginへリダイレクトされます。
でも未認証で触れる箇所に新規登録(register)があるのは気持ち良くないのでリンクを外します。

ルート【routes\web.php】でルートのビューを探します。

私の場合はLaravel標準のwelcomeをそのまま閲覧しています。

ビュー【resources\views\welcome.blade.php】を確認します。

Registerありましたね。こいつを削除します。

次にログインのヘッダーにあるRegisterを処理します。

【resources\views\auth\login.blade.php】を確認します。

ヘッダーはlayouts.appにある様です。【resources\views\layouts\app.blade.php】を確認します。

47行目あたりにありました。ここからRegisterを削除します。

たったこれだけで最初に上げた項目【1,2,5,6】が実装できてしまいました。
Laravelおそるべし。

長くなったので update と delete については別記事で記載します。

まとめ

この機能の実装はトレイトを追ったりしかなり迷走しました。
だってねぇ、何やってもリダイレクトでhomeに戻ってきちゃうし。

肝は【\app\Http\Auth\RegisterController.php】の変更です。

解ると簡単なんですよね「今までの苦労は何だったんだ」と思う程度に。