見出し画像

【Laravel 7.x】管理者ユーザーでユーザー作成を行い、作成したユーザーで自動ログインをせず管理者のままにする方法

はじめに

社内での管理ツールを作っているとして、ユーザーの新規登録を社員個々人ではなく、管理者等の特定のユーザーで登録できるようにしていきたいと思います。

Laravelでログイン機能を使おうと思えば、

php artisan ui bootstrap --auth
php artisan ui vue --auth
php artisan ui react --auth

このいずれかで作る方が大半だと思いますが、これで生成された設定のままだと、ユーザー新規作成後、勝手に現在ログインしているユーザーから作成したユーザーがログインしてしまいます。これでは連続でユーザーを新規登録をする際に非効率です。なので自動ログインしない方法を実装していきます。

やりたいこと

・社員は自分たちで新規登録を行うことはできない
・管理者が自身のアカウントでログインして、社員の新規作成を行う
・作成後は作成した社員アカウントでの自動ログインは行わず、管理者のままログインしたままにする
<おまけ>
・Gateを使って管理者ユーザーでしかユーザーの新規作成を行えないものとする

やり方

まず前提として、ログイン機能は実装できているものとします。

まず他のユーザーに新規登録の表示をさせないように表示を消すorコメントアウトしておきましょう。ここでは書きませんが、

welcome.blade.php
layouts/app.blade.php

に記載されているはずです。

まずはリダイレクト先の変更

今回は新規登録したときの挙動を変更していきたいので
Controllers/Auth/RegisterController.php をまず見に行きます。

use RegistersUsers;

/**
* Where to redirect users after registration.
*
* @var string
*/
// protected $redirectTo = RouteServiceProvider::HOME;
protected $redirectTo = ('user'); // リダイレクト先はここを変更


/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
   $this->middleware('auth'); // ログインした後のユーザーではできないようにする
}

このように変更します。

自動ログインをしないようにする

次にこの機能を変えていこうと思ったのですが、個人的に難しかったです。

悩んでいると Controllers/Auth/RegisterController.php の中にそれらしきものを見つけました。

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use App\Providers\RouteServiceProvider;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers; // ここ!!!!
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class RegisterController extends Controller
{
   /*
   |--------------------------------------------------------------------------
   | Register Controller
   |--------------------------------------------------------------------------
   |
   | This controller handles the registration of new users as well as their
   | validation and creation. By default this controller uses a trait to
   | provide this functionality without requiring any additional code.
   |
   */

   use RegistersUsers; // これ何!!??

   /**
    * Where to redirect users after registration.
    *
    * @var string
    */
   // protected $redirectTo = RouteServiceProvider::HOME;
   protected $redirectTo = ('user');

ということで参照しに行きます。私はVS Codeを使っているので、
use RegistersUsers; にカーソルをあてて参照でその元に飛びました。

画像1

すると vender/laravel/ui/auth-backend/RegistersUsers.php というファイルに飛びました。

で、ファイルを見ていると、見つけました。

 * Handle a registration request for the application.
*
* @param  \Illuminate\Http\Request  $request
* @return \Illuminate\Http\Response
*/
public function register(Request $request)
{
   $this->validator($request->all())->validate();

   event(new Registered($user = $this->create($request->all())));

   $this->guard()->login($user); // これ!!!!!

   if ($response = $this->registered($request, $user)) {
       return $response;
   }

   return $request->wantsJson()
       ? new Response('', 201)
       : redirect($this->redirectPath());
}

$this->guard()->login($user) これが自動ログインの原因ですので、これをコメントアウトしました。

これで解決です。

おまけ

Gateを使って管理者ユーザーでしかユーザーの新規作成を行えないものとする

まずGate認証はこれを参考にしてやってみてください。

それでデフォルトのままのLaravelにログイン認証のルーティングは

Auth::routes();

こうなっていますが、これを分解して

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');

Route::group(['middleware' => ['auth', 'can:admin-higher']], function () {
   Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
   Route::post('register', 'Auth\RegisterController@register');
});

こんな感じにします。

今回は新規登録は管理者のみができるという設定にしたいので、新規登録だけ分けて、

Route::group(['middleware' => ['auth', 'can:admin-higher']], function ()

にしました。

以上です

この記事が気に入ったらサポートをしてみませんか?