Laravelでマルチ認証(マルチログイン)の実装方法

Laravel でマルチ認証を実装する方法です。
今回の例では2種類の会員区分で認証を分けていますが、例えば「会員と管理者」「会員種別1と会員種別2と管理者」といった場合でも同様に利用できます。

今回行うこと

  • 2種類の会員区分「ユーザ (users)」「先生 (teachers)」を作成する
  • 先生用の画面は /teachers/ 以下に配置する
  • ユーザ情報は users テーブルを利用する
  • 先生の情報は teachers テーブルを利用する
  • パスワードリセットとメール認証は今回設定しない

環境

macOS Mojave 10.14.6
Homestead 9.1.0
Laravel 5.8.35

認証機能を作成する

すでにLaravelのプロジェクトは作成されているものとします。

$ php artisan make:auth

このコマンドを実行後、マイグレーションをするとテーブルが作成されます。

先生用の認証を追加する

続いて先生用の認証を追加します。

モデルとマイグレーションファイルの作成

以下のコマンドを実行すると、Teacherモデルとteachers テーブル用マイグレーションファイルが作成されます。

$ php artisan make:model Teacher
$ php artisan make:migration create_teachers_table --create=teachers

Teacher モデルを編集する

app/User.phpの中身をそのまま app/Teacher.php にコピーし、モデル名だけを変更します。

<!--?php

namespace App;

use Illuminate\Notifications\Notifiable;<br ?--> use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class Teacher extends Authenticatable
{
use Notifiable;

/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];

/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];

}

マイグレーションファイルを編集する

database/migration内に create_teachers_tableのマイグレーションファイルがありますので、users_tableを参考に設定します。

public function up()
{
Schema::create('teachers', function (Blueprint $table) {
$table->increments('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}

マイグレーション

マイグレーションを実行し、teachers テーブルを作成します。

$ php artisan migrate

認証に関する設定を変更する

config/auth.php に認証に関する設定が記載されています。

すでにユーザ用の設定はありますので、これを参考に先生用の設定を追加します。

'defaults' => [
'guard' => 'user',  //webからuserに変更する
'passwords' => 'users',
],
'guards' => [
'user' => [
'driver' => 'session',
'provider' => 'users',
],
//ここから追加
'teacher' => [
'driver' => 'session',
'provider' => 'teachers',
],
//ここまで追加

'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],

'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class,
],

//追加
'teachers' => [
'driver' => 'eloquent',
'model' => App\Teacher::class,
],

//パスワードリセットを実装する場合は以下のように記載

'passwords' => [
'users' => [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
],

'teachers' => [
'provider' => 'teachers',
'table' => 'password_resets',
'expire' => 60,
],
],

Controllerを作成する

先生用の認証に使うコントローラーを作成します。

app/Http/Controllers に AuthTeacher ディレクトリを作成し、app/Http/Controllers/Auth の中身を全てコピーします。

app
├── Http
├── Controllers
├── AuthTeacher // ディレクトリを作成
├── ForgotPasswordController.php
├── LoginController.php
├── RegisterController.php
├── ResetPasswordController.php
└── VerificationController.php

コピー後、それぞれのファイルを編集します。

ForgotPasswordController.php, ResetPasswordController.php, VerificationController.php

namespaceを編集するだけでOKです。

namespace App\Http\Controllers\AuthTeacher;

LoginController.php

以下のように変更します。

namespace App\Http\Controllers\AuthAdmin;

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 = '/admins/mypage'; //ログイン後の遷移先

public function __construct()
{
$this->middleware('guest:admin')->except('logout'); //ミドルウェアの変更
}

public function showLoginForm()
{
return view('teacher_auth.login'); //ログインページ
}

protected function guard()
{
return Auth::guard('teacher'); //先生用のguardに変更
}

public function logout(Request $request)
{
$this->guard()->logout();
return redirect('/teachers/login'); //ログアウト後の遷移先
}
}

RegisterController.php

こちらも以下のように変更します。

namespace App\Http\Controllers\AuthTeacher; //namespace 変更

use App\Teacher; //追加
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Foundation\Auth\RegistersUsers;

class RegisterController extends Controller
{

use RegistersUsers;

protected $redirectTo = '/teachers/mypage'; //登録後の遷移先

public function __construct()
{
$this->middleware('guest:teacher'); //ミドルウェアの変更
}

public function showRegisterForm()
{
return view('teachern_auth.register'); //登録フォーム
}

protected function validator(array $data)
{
return Validator::make($data, [
'name' => ['required', 'string', 'max:255'],
'email' => ['required', 'string', 'email', 'max:255', 'unique:teachers'], // teachesテーブルに変更
'password' =>; ['required', 'string', 'min:6', 'confirmed'],
]);
}

protected function create(array $data)
{
return Teacher::create([ //Teacherに変更
'username' => $data['username'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
]);
}

protected function guard()
{
return Auth::guard('teacher'); //先生用のguardを設定
}
}

登録後・ログイン後の遷移先ページに関しては適宜作成して下さい。
今回はmypageへ遷移する設定にしてあります。

Viewを作成する

resources/views にteachers_auth ディレクトリを作成し、views/auth の中身を全てコピーします。
またteachers ディレクトリを作成し、この中に先生側のview(今回はmypage.blade.phpのみ)を作成します。

views
├── auth
│ ├── login.blade.php
│ ├── passwords
│ │ ├── email.blade.php
│ │ └── reset.blade.php
│ ├── register.blade.php
│ └── verify.blade.php
│
├── teacher_auth
│ ├── login.blade.php
│ ├── passwords
│ │ ├── email.blade.php
│ │ └── reset.blade.php
│ ├── register.blade.php
│ └── verify.blade.php
│
├── teachers
│ └── mypage.blade.php
│
├── layouts
├── teacher.blade.php //レイアウトを使い分ける場合はここも作成
└── app.blade.php

ビューを変更する

route()の指定をteacherに変更します(ルーティングは以下で設定)

ルーティングを設定する

routes/web.php に先生用の認証に使用するルーティングを設定します。

//先生用認証
Route::group(['prefix' => 'teachers'], function () { //teachesディレクトリをここで指定しておく
Route::get('login', 'AuthTeacher\LoginController@showLoginForm')->name('teacher_auth.login');
Route::post('login', 'AuthTeacher\LoginController@login')->name('teacher_auth.login');
Route::post('logout', 'AuthTeacher\LoginController@logout')->name('teacher_auth.logout');
Route::post('password/email', 'AuthTeacher\ForgotPasswordController@sendResetLinkEmail')->name('teacher_auth.password.email');
Route::get('password/reset', 'AuthTeacher\ForgotPasswordController@showLinkRequestForm')->name('teacher_auth.password.request');
Route::post('password/reset', 'AuthTeacher\ResetPasswordController@reset')->name('teacher_auth.password.update');
Route::get('password/reset/{token}', 'AuthTeacher\ResetPasswordController@showResetForm')->name('teacher_auth.password.reset');
});

最後に

これでLaravelの基本的なマルチ認証は完成です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です