Laravel で階層別ログインを実現する

Laravel のログインコンフィグ config/auth.php をいじると階層別ログインを実現できます。

例えば、一般ユーザ用、オーナー用、システム管理者用と3つの階層に分けるために

  • 一般ユーザ→ モデル: App\User.php テーブル: users
  • オーナー → モデル: App\OwnerUser.php テーブル: owner_users
  • システム管理者 → モデル: App\Admin.php テーブル admins

とした場合、config/auth.php に以下の記述を追加します。

'guards' => [
  'owner' => [ 'driver' => 'session', 'provider' => 'owners' ],
  'admin' => [ 'driver' => 'session', 'provider' => 'admins' ],
],
'providers' => [
  'owners' => [ 'driver' => 'eloquent', model => App\OwnerUser::class ],
  'admins' => [ 'driver' => 'eloquent', model => App\Admin::class ],
],
'passwords' => [
  'owners' => [ 'provider' => 'owners', 'table' => 'password_resets', expire => 60 ],
  'admins' => [ 'provider' => 'admins', 'table' => 'password_resets', expire => 60 ],
],

それぞれの階層に応じたログイン画面を構成します。URL を仮に /user/login, /owner/login, /admin/login とすると (id, email, password は最低限テーブルに含むとします)、

<form method="post">
  <div class="form-group">
    <label for="email">Email</label>
    <div class="form-control"><input id="email" name="email"></div>
  </div>
  <div class="form-group">
    <label for="password">Password</label>
    <div class="form-control"><input id="password" name="password" type="password"></div>
  </div>
</form>

routes/web.php は

use App\Http\Controllers\UserLogin;
use App\Http\Controllers\OwnerLogin;
use App\Http\Controllers\AdminLogin;

Route::get('/user/login', [UserLogin::class, 'showLoginForm']);
Route::post('/user/login', [UserLogin::class, 'login']);
Route::get('/owner/login', [OwnerLogin::class, 'showLoginForm']);
Route::post('/owner/login', [OwnerLogin::class, 'login']);
Route::get('/admin/login', [AdminLogin::class, 'showLoginForm']);
Route::post('/admin/login', [AdminLogin::class, 'login']);

UserLogin クラスは以下のようになります。

class UserLogin extends Controller {
  use AuthenticatesUsers;

  // ①
  protected $redirectTo = "/users/mypage";

  public function __construct() {
    parent::__construct();
    // ②
    $this->middleware('guest')->except('logout');
  }

  public function showLoginForm() {
    // ③
    return view('users.login');
  }

  public function guard() {
    // ④
    return Auth::guard('user');
  }

  public function logout(Requests $requests) {
    // ⑤
    Auth::guard('user')->logout();
  }
}

OwnerLogin, AdminLogin に対応するには、①~④までを以下のように置き換えます。

番号OwnerAdmin
“/owner/mypage”“admin/mypage”
middleware(‘guest:owner’)middleware(‘guest:admin’)
view(‘owners.login’)view(‘admins.login’)
guard(‘owner’)guard(‘admin’)
guard(‘owner’)guard(‘admin’)

auth() の結果は以下のようになります。

URLauth()
/user/mypageUser インスタンス
/owner/mypageOwnerUser インスタンス
/admin/mypageAdminUser インスタンス
投稿者について
みのしす

小さいときは科学者になろうとしたのに、その時にたまたま身に着けたプログラミングで未だに飯を食っているしがないおじさんです。(年齢的にはもうすぐおじいさん)

コメントを残す

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