Laravel6で認証をユーザーと管理者など複数にわける場合のメモ。
まずは普通にログイン機能を実装
Laravel 6.0 ログイン機能を実装する - Qiita
Laravel6.0「make:Auth」が無くなった 〜Laravel6.0でのLogin機能の実装方法〜MyMemo - Qiita
ここは参考になる記事が多くあるので説明は省略。
作成したログイン機能に追加
新しく管理者(Admin)の認証機能を追加する。
1. モデルクラスを作成
他のモデルクラスと同じようにマイグレーションファイル(DB)とモデルクラス(Admin.php)を作成。
モデルクラスはIlluminate\Database\Eloquent\Model
ではなくIlluminate\Foundation\Auth\User
を継承する。
use Illuminate\Foundation\Auth\User as Authenticatable;
class Admin extends Authenticatable // ModelではなくAuthenticatable
{
}
2. 認証ファイルに追記
下記の内容をconfig/auth.php
に追記する。
'guards' => [
...
'admin' => [
'driver' => 'session',
'provider' => 'admin',
],
...
],
'providers' => [
...
'admin' => [
'driver' => 'eloquent',
'model' => App\Admin::class, // 1 で作成したモデルを指定
],
...
],
'passwords' => [
...
'admin' => [
'provider' => 'admin',
'table' => 'password_resets',
'expire' => 60,
],
...
],
3. Routeに認証機能を追加
Route::group(['middleware' => 'auth:admin'], function () {
...
});
4. ログインしていない場合のリダイレクト先を指定
ログイン処理が必要なURLにログインせずにアクセスした場合のリダイレクト先を
ユーザー、管理者等で分けたい場合は記述する。
protected function unauthenticated($request, AuthenticationException $exception)
{
if($request->expectsJson()){
return response()->json(['message' => $exception->getMessage()], 401);
}
if (in_array('admin', $exception->guards(), true)) {
return redirect()->guest(route('admin.login'));
}
return redirect()->guest(route('login'));
}
5. ログイン後にログインページにアクセスした場合のリダイレクト先を指定
public function handle($request, Closure $next, $guard = null)
{
switch ($guard) {
case 'admin':
$redirectPath = '/admin/index';
break;
default:
$redirectPath = '/index';
break;
}
if (Auth::guard($guard)->check()) {
return redirect($redirectPath);
}
return $next($request);
}
6. ログインコントローラー作成
ユーザーの認証に使用しているLoginController
とは別に作成する。
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = 'admin/index'; // ログイン後のリダイレクト先
public function __construct(Request $request)
{
$this->middleware('guest:admin')->except('logout');;
}
protected function guard()
{
return Auth::guard('admin');
}
}
その他username
, showLoginForm
などのメソッドはユーザーのLoginControllerと同じように、必要に応じて設定する。
参考
【Laravel】マルチログイン(ユーザーと管理者など)機能を設定してみた【体験談】 | もんプロ~問題発見と解決のためのプログラミング〜