【준비편】Laravel 8(+jetstream, fortify)로 멀티 로그인

소개



Laravel8에서 표준 사용자 인증 기능이 laravel/ui에서 Laravel Jetstream + Laravel Fortify로 변경되었습니다. 새로운 인증 기능도 laravel/ui와 마찬가지로 도입 자체는 매우 간단하고, 다기능(프로필 관리, 팀 관리, 2단계 인증 등), 필요에 따라 config 파일에서 이용하는 기능을 선택할 수 있다 가능합니다. 한편, 인증 처리의 구현이 바뀌고 있는 경우도 있어, 확장하기에는 조금 수고가 걸립니다(했습니다). 문서 에서는 다음과 같이 언급되고 있습니다만,

Laravel Jetstream에서 제공하는 인증 스캐폴드를 사용할 필요가 없다는 점에 유의하십시오. 이 스캐폴드를 사용하지 않는 선택을 한 경우, Laravel의 인증 클래스를 직접 사용해, 사용자의 인증 관리를 실시할 필요가 있습니다.

모처럼이라면 새로운 인증 기능을 사용하고 싶다!
그래서 본 기사에서는 일반 사용자와 관리자 사용자로 로그인 화면, 로그인 후 화면을 나누는 멀티 로그인을 Laravel Jetstream과 Laravel Fortify를 사용하여 구현합니다.
또한, Laravel Fortify의 상세한 처리를 깊이 추구하거나 설명하는 것은 이 기사가 아닙니다.

운영 환경



이 기사에서는 모두 로컬에서 작동합니다.
  • PHP 7.4.11
  • MySQL 8.0.21
  • Laravel Framework 8.10.0

  • 멀티 로그인 사양


  • 일반 사용자(User), 관리자(Admin)로 로그인 사용자와 페이지를 나누는
  • 라우팅은 이하로 한다(본 기사에서는 도메인은 localhost:8000로서 취급합니다)
  • 일반 사용자 로그인 페이지
  • localhost:8000/login

  • 일반 사용자 톱 페이지
  • localhost:8000/dashboard

  • 관리자 로그인 페이지
  • localhost:8000/admin/login

  • 관리자 톱 페이지
  • localhost:8000/admin/dashboard


  • 두 사용자 모두 로그인되지 않은 경우 톱 페이지를 표시 할 수 없습니다 (로그인 페이지로 리디렉션)

  • 프로젝트 준비


  • 프로젝트 생성(이번은 multi-auth라는 프로젝트로 하고 있습니다)
  • Blade + livewire를 사용하기 때문에 Which Jetstream stack do you prefer? 는 0을 선택
  • teams는 사용하지 않으므로 Will your application use teams? 는 no를 선택

  • $ laravel new multi-auth --jet
    
    
        |     |         |
        |,---.|--- ,---.|--- ,---.,---.,---.,-.-.
        ||---'|    `---.|    |    |---',---|| | |
    `---'`---'`---'`---'`---'`    `---'`---^` ' '
    
    
    Which Jetstream stack do you prefer?
      [0] livewire
      [1] inertia
     > 0
    
     Will your application use teams? (yes/no) [no]:
     > no
    
    Installing laravel/laravel (v8.1.0)
      - Installing laravel/laravel (v8.1.0): Downloading (100%)         
    Created project in /{your-workspace-root}/multi-auth
    ~~省略~~
    Application ready! Build something amazing.
    
  • 프로젝트가 생성되면 자산 빌드 실행
  • $ cd multi-auth
    $ npm install && npm run dev
    
  • .env의 DB_DATABASE와 같은 이름의 DB를, 로컬 MySQL로 작성해 migration을 실행

  • .env
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=multi_auth ← これ
    DB_USERNAME=root
    DB_PASSWORD=
    
    $ php artisan migrate
    
    Migration table created successfully.
    Migrating: 2014_10_12_000000_create_users_table
    Migrated:  2014_10_12_000000_create_users_table (42.86ms)
    Migrating: 2014_10_12_100000_create_password_resets_table
    Migrated:  2014_10_12_100000_create_password_resets_table (19.50ms)
    Migrating: 2014_10_12_200000_add_two_factor_columns_to_users_table
    Migrated:  2014_10_12_200000_add_two_factor_columns_to_users_table (22.99ms)
    Migrating: 2019_08_19_000000_create_failed_jobs_table
    Migrated:  2019_08_19_000000_create_failed_jobs_table (25.19ms)
    Migrating: 2019_12_14_000001_create_personal_access_tokens_table
    Migrated:  2019_12_14_000001_create_personal_access_tokens_table (39.09ms)
    Migrating: 2020_10_14_073012_create_sessions_table
    Migrated:  2020_10_14_073012_create_sessions_table (52.85ms)
    
  • Admin 모델 작성 및 migration 실행
  • create_users_table.php에서 up 메소드의 내용을 copipe

  • $ php artisan make:model Admin -m
    Model created successfully.
    Created Migration: 2020_10_14_075325_create_admins_table
    

    create_admins_table.php
    ~~省略~~
        public function up()
        {
            Schema::create('admins', function (Blueprint $table) {
                $table->id();
                $table->string('name');
                $table->string('email')->unique();
                $table->timestamp('email_verified_at')->nullable();
                $table->string('password');
                $table->rememberToken();
                $table->foreignId('current_team_id')->nullable();
                $table->text('profile_photo_path')->nullable();
                $table->timestamps();
            });
        }
    
    $ php artisan migrate
    Migrating: 2020_10_14_075325_create_admins_table
    Migrated:  2020_10_14_075325_create_admins_table (31.63ms)
    
  • Admin 모델의 내용 수정 (User.php에서 copipe)

  • Admin.php
    <?php
    
    namespace App\Models;
    
    use Illuminate\Contracts\Auth\MustVerifyEmail;
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    use Illuminate\Notifications\Notifiable;
    use Laravel\Fortify\TwoFactorAuthenticatable;
    use Laravel\Jetstream\HasProfilePhoto;
    use Laravel\Sanctum\HasApiTokens;
    
    class Admin extends Authenticatable
    {
        use HasApiTokens;
        use HasFactory;
        use HasProfilePhoto;
        use Notifiable;
        use TwoFactorAuthenticatable;
    
        /**
         * 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',
            'two_factor_recovery_codes',
            'two_factor_secret',
        ];
    
        /**
         * The attributes that should be cast to native types.
         *
         * @var array
         */
        protected $casts = [
            'email_verified_at' => 'datetime',
        ];
    
        /**
         * The accessors to append to the model's array form.
         *
         * @var array
         */
        protected $appends = [
            'profile_photo_url',
        ];
    }
    
    
  • 일반 사용자와 관리자를 시더로 생성할 수 있도록 한다
  • $ php artisan make:seeder UserSeeder
    Seeder created successfully.
    $ php artisan make:seeder AdminSeeder
    Seeder created successfully.
    

    UserSeeder.php
    <?php
    
    namespace Database\Seeders;
    
    use App\Models\User;
    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\Hash;
    
    class UserSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            User::create([
                'name' => '一般ユーザー',
                'email' => '[email protected]',
                'password' => Hash::make('password'),
            ]);
        }
    }
    

    AdminSeeder.php
    <?php
    
    namespace Database\Seeders;
    
    use App\Models\Admin;
    use Illuminate\Database\Seeder;
    use Illuminate\Support\Facades\Hash;
    
    class AdminSeeder extends Seeder
    {
        /**
         * Run the database seeds.
         *
         * @return void
         */
        public function run()
        {
            Admin::create([
                'name' => '管理者',
                'email' => '[email protected]',
                'password' => Hash::make('password')
            ]);
        }
    }
    

    DatabaseSeeder.php
    <?php
    
    namespace Database\Seeders;
    
    use Illuminate\Database\Seeder;
    
    class DatabaseSeeder extends Seeder
    {
        /**
         * Seed the application's database.
         *
         * @return void
         */
        public function run()
        {
            $this->call(UserSeeder::class);
            $this->call(AdminSeeder::class);
        }
    }
    
    $ php artisan db:seed 
    Seeding: Database\Seeders\UserSeeder
    Seeded:  Database\Seeders\UserSeeder (250.64ms)
    Seeding: Database\Seeders\AdminSeeder
    Seeded:  Database\Seeders\AdminSeeder (106.95ms)
    Database seeding completed successfully.
    
  • 내장 서버를 시작하고 브라우저에서 localhost:8000 보기
  • localhost : 8000/login에서 일반 사용자로 로그인 할 수 있는지 확인

  • $ php artisan serve
    
    Starting Laravel development server: http://127.0.0.1:8000
    [Mon Oct 1 00:00:00 0000] PHP 7.4.11 Development Server (http://127.0.0.1:8000) started
    





    안전하게 로그인할 수 있으면 준비편은 종료



    실장편 다음

    좋은 웹페이지 즐겨찾기