![見出し画像](https://assets.st-note.com/production/uploads/images/35837822/rectangle_large_type_2_34aa221dc0f177420f17efa77d5840e6.png?width=1200)
【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; にカーソルをあてて参照でその元に飛びました。
すると 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 ()
にしました。
以上です
この記事が気に入ったらサポートをしてみませんか?