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の基本的なマルチ認証は完成です。
コメントを残す