laravel8 + breezeで一般ユーザ・管理者のログインを分けてみる(usersテーブルに管理者フラグを追加するだけ)
【laravel6.0】同じログイン画面で、一般ユーザとadminユーザを振り分ける(Gateを使ってusersの管理権限をadminユーザのみにする)
laravel8で、メアドとパスワードでユーザ認証したいだけなんじゃ~!
laravel ui
laravel breeze
の二択。それなら新しいbreezeで実装しよう。bladeだけで実装できるし(ただしtailwind cssを使うのでnodeは必要)
普通にlaravel8をインストールしたら
1, ログイン機能を作る
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# breezeをインストール composer require laravel/breeze --dev # 必要なファイルをコピー php artisan breeze:install # nodeとnpmのインストール sudo apt-get install nodejs sudo apt-get install npm # なんか古いバージョンがインストールされた…。n package を使って 最新node をインストールしなおす sudo npm install n -g # 混乱を避けるべく、最初に入れた古い nodejs, npm は消します。そして再ログイン。 sudo n stable sudo apt purge -y nodejs npm exec $SHELL -l # 最新版のnode/npmになっているはず! node -v v14.17.6 # nodeでビルド npm install && npm run dev |
2, userテーブルにadminフラグを追加しておく
1 |
$table->boolean('admin')->default(false); |
3, seederで管理者ユーザと一般ユーザを作っておく
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public function run() { // \App\Models\User::factory(10)->create(); \DB::table('users')->insert([ [ 'name' => 'admin', 'email' => 'admin@example.com', 'email_verified_at' => now(), 'password' => \Hash::make('admin'), 'admin' => true, 'created_at' => now(), 'updated_at' => now() ],[ 'name' => 'test', 'email' => 'test@example.com', 'email_verified_at' => now(), 'password' => \Hash::make('test'), 'admin' => false, 'created_at' => now(), 'updated_at' => now() ] ]); } |
4, 管理者ユーザのみアクセスできるGuardを作る
app/Providers/AuthServiceProvider.php
1 2 3 4 5 6 7 8 |
public function boot() { $this->registerPolicies(); // 管理者ユーザのみ許可 Gate::define('admin', function ($user) { return $user->admin == true; }); } |
5, /adminのルーティングとguard
routes/web.php
1 2 3 4 5 6 |
// admin以下は管理者のみアクセス可 Route::group(['prefix' => 'admin', 'middleware' => ['auth', 'can:admin']], function () { Route::get('/', function () { return 'admin only'; }); }); |
6, adminユーザでログインしたら、/dashboardじゃなくて/adminにリダイレクトさせる
app/Http/Controllers/Auth/AuthenticatedSessionController.php
1 2 3 4 5 6 7 8 9 10 11 12 |
public function store(LoginRequest $request) { $request->authenticate(); $request->session()->regenerate(); // 管理者だったら、ログイン後に/adminにリダイレクト if (Auth::User()->admin == true) { return redirect('/admin'); } return redirect()->intended(RouteServiceProvider::HOME); } |