ユーザ用ツール

サイト用ツール


プログラム言語:php:laravel:認証:laravel7でマルチ認証

文書の過去の版を表示しています。


【Laravel 7】マルチ認証(User と Admin で階層分け)

パッケージのインストール

  1. composer require laravel/ui:^2.4
  2.  
  3. php artisan ui vue --auth
  4.  
  5. # NodeJS がない場合はインストール
  6. curl -sL https://rpm.nodesource.com/setup_14.x | bash -
  7. yum -y install nodejs
  8.  
  9. # package.json に記載されたパッケージのインストール
  10. npm install
  11.  
  12. # css、js ファイルのビルド(未圧縮)
  13. npm run dev
  14.  
  15. # css、js ファイルのビルド(圧縮)
  16. npm run production

マイグレーション

以下コマンドで、マイグレーションファイルとモデルファイルを作成。

  1. # Model ファイル作成 (-m オプションでマイグレーションも作成)
  2. php artisan make:model Models/Admin -m

database\migrations に作成された「create_admins_table.php」に「create_users_table.php」の中身をコピペし、admin 用に書き換える。

  • クラス名:CreateUsersTable → CreateAdminsTable
  • テーブル名:users → admins
  1. # マイグレーションの実行
  2. php artisan migrate

シーダー

ログイン用のアカウントを作成する。

  1. # シーダー作成
  2. php artisan make:seeder UsersTableSeeder
  3. php artisan make:seeder AdminsTableSeeder

database\seeds\UsersTableSeeder.php

  1. public function run()
  2. {
  3. DB::table('users')->insert([
  4. 'name' => 'user',
  5. 'email' => 'user@example.com',
  6. 'password' => Hash::make('user'),
  7. 'remember_token' => Str::random(10),
  8. ]);
  9. }

database\seeds\AdminsTableSeeder.php

  1. public function run()
  2. {
  3. DB::table('admins')->insert([
  4. 'name' => 'admin',
  5. 'email' => 'admin@example.com',
  6. 'password' => Hash::make('admin'),
  7. 'remember_token' => Str::random(10),
  8. ]);
  9. }

database\seeds\DatabaseSeeder.php

  1. <?php
  2.  
  3. use Illuminate\Database\Seeder;
  4.  
  5. class DatabaseSeeder extends Seeder
  6. {
  7. public function run()
  8. {
  9. $this->call([
  10. AdminsTableSeeder::class,
  11. UsersTableSeeder::class,
  12. ]);
  13. }
  14. }
  1. # シーダーをオートローダに登録
  2. php composer dump-autoload
  3.  
  4. # シーディング実行
  5. php artisan db:seed

モデル

app 直下にある User.php を app\Models の中に 移動。

app\Models\User.php

  1. // ディレクトリを移動したので、namespace を書き換え
  2. namespace App;
  3.  
  4. namespace App\Models;

app\Models\Admin.php

  1. // app\Models\User.php の内容をコピペし、クラス名を書き換える
  2. class User extends Authenticatable
  3.  
  4. class Admin extends Authenticatable

モデルファイルのパスが変わったので、関係するファイルも書き換え。

app\Http\Controllers\Auth\RegisterController.php

  1. use App\User;
  2.  
  3. use App\Models\User;

config\auth.php

  1. 'model' => App\User::class,
  2.  
  3. 'model' => App\Models\User::class,

コンフィグ

認証の設定ファイルをマルチ認証対応に書き換える。

config\auth.php

  1. // デフォルトを user に変更
  2. 'defaults' => [
  3. 'guard' => 'user',
  4. 'passwords' => 'users',
  5. ],
  6.  
  7. 'guards' => [
  8. // web → user に変更
  9. 'user' => [
  10. 'driver' => 'session',
  11. 'provider' => 'users',
  12. ],
  13. // admin を追加
  14. 'admin' => [
  15. 'driver' => 'session',
  16. 'provider' => 'admins',
  17. ],
  18. 'api' => [
  19. 'driver' => 'token',
  20. 'provider' => 'users',
  21. 'hash' => false,
  22. ],
  23. ],
  24.  
  25. 'providers' => [
  26. 'users' => [
  27. 'driver' => 'eloquent',
  28. 'model' => App\Models\User::class,
  29. ],
  30. // admins を追加
  31. 'admins' => [
  32. 'driver' => 'eloquent',
  33. 'model' => App\Models\Admin::class,
  34. ],
  35. ],
  36.  
  37. 'passwords' => [
  38. 'users' => [
  39. 'provider' => 'users',
  40. 'table' => 'password_resets',
  41. 'expire' => 60,
  42. 'throttle' => 60,
  43. ],
  44. // admins を追加
  45. 'admins' => [
  46. 'provider' => 'admins',
  47. 'table' => 'password_resets',
  48. 'expire' => 60,
  49. 'throttle' => 60,
  50. ],
  51. ],

コントローラー

app\Http\Controllers に User ディレクトリを作成し、Auth ディレクトリと HomeController.php をその中に移動。
今回、ログイン機能しか使わないため Auth 内のファイルは LoginController.php を残して削除。

app\Http\Controllers\User\HomeController.php

  1. // namespace を書き換え
  2. namespace App\Http\Controllers\User;
  3.  
  4. // 追加
  5. use App\Http\Controllers\Controller;
  6.  
  7. public function __construct()
  8. {
  9. // 今回ルーティング側で auth 設定をしているため
  10. // この一連のコメント行は削除
  11. // $this->middleware('auth:user');
  12. }
  13.  
  14. public function index()
  15. {
  16. // 書き換え
  17. return view('user.home');
  18. }

app\Http\Controllers\User\Auth\LoginController.php

  1. // namespace の書き換え
  2. namespace App\Http\Controllers\User\Auth;
  3.  
  4. // 追加
  5. use Illuminate\Http\Request;
  6. use Illuminate\Support\Facades\Auth;
  7.  
  8. public function __construct()
  9. {
  10. // 書き換え
  11. $this->middleware('guest:user')->except('logout');
  12. }
  13.  
  14. // 以下追加
  15. protected function guard()
  16. {
  17. return Auth::guard('user');
  18. }
  19.  
  20. public function showLoginForm()
  21. {
  22. return view('user.auth.login');
  23. }
  24.  
  25. public function logout(Request $request)
  26. {
  27. Auth::guard('user')->logout();
  28.  
  29. return $this->loggedOut($request);
  30. }
  31.  
  32. public function loggedOut(Request $request)
  33. {
  34. return redirect(route('user.login'));
  35. }

app\Http\Controllers\User ディレクトリをコピーして Admin ディレクトリを作成。
ディレクトリ内のファイルで、それぞれ以下の置換を行う。

  • User → Admin
  • user → admin

ルーティング

routes\web.php

  1. Route::namespace('User')->prefix('user')->name('user.')->group(function(){
  2. Auth::routes([
  3. 'register' => false,
  4. 'reset' => false,
  5. 'verify' => false
  6. ]);
  7.  
  8. Route::middleware('auth:user')->group(function(){
  9. Route::get('home', 'HomeController@index')->name('home');
  10. });
  11. });
  12.  
  13. Route::namespace('Admin')->prefix('admin')->name('admin.')->group(function(){
  14. Auth::routes([
  15. 'register' => false,
  16. 'reset' => false,
  17. 'verify' => false
  18. ]);
  19.  
  20. Route::middleware('auth:admin')->group(function(){
  21. Route::get('home', 'HomeController@index')->name('home');
  22. });
  23. });

その他書き換え

app\Providers\RouteServiceProvider.php

  1. public const HOME = '/user/home';
  2. public const ADMIN_HOME = '/admin/home';

app\Http\Middleware\Authenticate.php

  1. use Illuminate\Support\Facades\Route;
  2.  
  3. protected function redirectTo($request)
  4. {
  5. if (! $request->expectsJson()) {
  6. if (Route::is('user.*')) {
  7. return route('user.login');
  8.  
  9. } elseif (Route::is('admin.*')) {
  10. return route('admin.login');
  11. }
  12. }
  13. }

app\Http\Middleware\RedirectIfAuthenticated.php

  1. public function handle($request, Closure $next, $guard = null)
  2. {
  3. if (Auth::guard($guard)->check() && $guard === 'user') {
  4. return redirect(RouteServiceProvider::HOME);
  5. } elseif (Auth::guard($guard)->check() && $guard === 'admin') {
  6. return redirect(RouteServiceProvider::ADMIN_HOME);
  7. }
  8.  
  9. return $next($request);
  10. }

コメント

コメントを入力. Wiki文法が有効です:
 
プログラム言語/php/laravel/認証/laravel7でマルチ認証.1614735883.txt.gz · 最終更新: 2021/03/03 10:44 by humolife