Laravel 8 다중 역할 기반 인증



이전 기사에 이어 라이브러리를 사용하지 않고 사용자 역할이 여러 개인 경우에도 사용자 역할 기반 인증을 표시하는 처리 방법multiple role-based authentications in Laravel에 대해 썼습니다.

이 글에서는 현재 버전의 라라벨에서 다중 역할 기반 인증을 적절하게 처리하는 방법과 이를 효율적으로 처리하는 방법에 대해 설명하겠습니다.

이 문서의 시나리오를 사용하여 로그인 성공 시 리디렉션할 다른 역할과 다른 대시보드를 가진 3명의 사용자가 있습니다.

사용자는 다음과 같습니다.
  • 관리자
  • 선수들
  • 스카우트

  • 좋습니다. 시나리오가 충분히 명확하고 원하는 내용이라면 자습서를 자세히 살펴보겠습니다.

    자세히 살펴보기 전에 귀하가 백엔드 개발자이거나 이 경력 경로를 탐구하려는 경우 다른 개발자와 함께 생산성을 높일 수 있는 백엔드 개발에 대한 일일 기사를 받아보십시오.

    시작하기



    Laravel 프로젝트를 설정하고 Laravel 역할 기반 인증을 처리하는 데 필요한 필수 라이브러리를 설치하는 것으로 시작하겠습니다.

    시연을 위해 새로운 Laravel 프로젝트를 설치하는 것으로 시작하지만 이미 프로젝트가 있는 경우 이 프로세스를 건너뛸 수 있습니다.

    다음 명령을 사용하여 새로운 Laravel 프로젝트를 설치하거나 여기에서 문서를 확인할 수 있습니다.

    composer create-project --prefer-dist laravel/laravel MultiAuth
    


    데이터베이스 설정



    다음으로 데이터베이스를 설정하고 데이터베이스에 올바르게 연결하도록 .env 파일을 구성하겠습니다.

    선택한 데이터베이스 클라이언트로 데이터베이스를 생성하고click here 데이터베이스를 올바르게 구성하는 방법을 확인할 수 있습니다.

    DB_CONNECTION=mysql 
    DB_HOST=127.0.0.1 
    DB_PORT=3306 
    DB_DATABASE=DB NAME HERE 
    DB_USERNAME=DB USERNAME HERE 
    DB_PASSWORD=DB PASSWORD HERE
    


    이제 Eloquent database 스키마를 설정하겠습니다.

    <?php
    
    use Illuminate\Support\Facades\Schema;
    
    use Illuminate\Database\Schema\Blueprint;
    
    use Illuminate\Database\Migrations\Migration;
    
    class CreateUsersTable extends Migration
    
    {
    
    /**
    
    * Run the migrations.
    
    * @return void
    
    */
    
    public function up()
    
    {
    
     Schema::create('users', function (Blueprint $table) {
    
       $table->increments('id');
    
       $table->string('name');
    
       $table->string('email')->unique();
    
       $table->string('role');
    
       $table->timestamp('email_verified_at')->nullable();
    
       $table->string('password');
    
       $table->rememberToken();
    
       $table->timestamps();
    
    });
    
    }
    
    /**
    
    * Reverse the migrations.
    
    * @return void
    
    */
    
    public function down()
    
    {
    
      Schema::dropIfExists('users');
    
    }
    
    }
    


    모든 것을 설정하고 위와 같이 스키마를 생성한 후.

    다음 명령을 실행합니다.

    php artisan migrate
    


    인증 설정



    Laravel 인증을 설정하기 위해 더 나아가서 새 프로젝트에 대한 완전한 사용자 등록 및 로그인 시스템을 만들 것입니다.

    먼저 Auth 패키지를 설치하여 Auth 시스템을 스캐폴드합니다.

    composer require laravel/ui
    


    UI를 생성하려면 다음 명령을 실행합니다.

    php artisan ui bootstrap --auth 
    
    npm run install 
    
    npm run dev
    


    미들웨어 생성



    다음으로 다양한 사용자를 위한 다양한 미들웨어를 생성하고 이를 kernel.php 파일에 등록합니다.

    php artisan make:middleware Admin 
    php artisan make:middleware Player
    
     // Repeat for all users
    


    미들웨어 설정



    이제 각 미들웨어에 다음 코드를 추가하고 미들웨어와 동일한 역할에서만 다음 메서드를 허용합니다.

    <?php
    
    namespace App\Http\Middleware;
    
    use Auth;
    
    use Closure;
    
    class Player
    
    {
    
    /**
    
    * Handle an incoming request.
    
    * @param \Illuminate\Http\Request $request
    
    * @param \Closure $next
    
    * @return mixed
    
    */
    
    public function handle($request, Closure $next)
    
    {
    
     if (!Auth::check()) {
    
      return redirect()->route('login');
    
     }
    
     if (Auth::user()->role == 'scout') {
    
      return redirect()->route('scout');
    
     }
    
     if (Auth::user()->role == 'player') {
    
      return $next($request);
    
     }
    
     if (Auth::user()->role == 'admin') {
    
      return redirect()->route('admin');
    
     }
    
     }
    
    }
    


    위의 Player 미들웨어에서 역할이 플레이어와 같을 때 우리는 $next 메서드를 반환하고 그렇지 않으면 다른 경로로 리디렉션합니다.

    이제 위에서 생성한 다른 미들웨어를 등록해 봅시다.

    /**
    
    * The application's route middleware.
    
    * These middleware may be assigned to groups or used individually.
    
    * @var array
    
    */
    
    protected $routeMiddleware = [
    
    'auth' => \App\Http\Middleware\Authenticate::class,
    
    // .............
    
    'player' => \App\Http\Middleware\Player::class,
    
    'admin' => \App\Http\Middleware\Admin::class,
    
    'scout' => \App\Http\Middleware\Scout::class
    
    ];
    


    경로 만들기:



    경로를 등록한 후 web.php로 이동하여 다음 코드를 추가하여 해당 미들웨어에 경로를 매핑합니다.

    /*
    
    |----------------------------------------------------------
    
    | Web Routes
    
    |----------------------------------------------------------
    
    */
    
    Route::get('/', function () {
    
    return view('welcome');
    
    });
    
    Auth::routes();
    
    Route::get('/player', 'PlayerController@index')->name('player')->middleware('player');
    
    Route::get('/admin', 'AdminController@index')->name('admin')->middleware('admin');
    
    Route::get('/scout', 'ScoutController@index')->name('scout')->middleware('scout');
    
    // ...........
    


    로그인 컨트롤러 업데이트



    다음으로 로그인 컨트롤러를 업데이트하고 다음 코드 줄을 추가하여 사용자가 성공적으로 로그인했을 때 적절한 경로로 리디렉션합니다.

    namespace App\Http\Controllers\Auth;
    
    use App\Http\Controllers\Controller;
    
    use Illuminate\Foundation\Auth\AuthenticatesUsers;
    
    use Auth;
    
    class LoginController extends Controller
    
    {
    
    use AuthenticatesUsers;
    
    protected $redirectTo;
    
    public function redirectTo()
    
    {
    
    switch (Auth::user()->role) {
    
    case 'admin':
    
        $this->redirectTo = '/admin';
    
        return $this->redirectTo;
    
        break;
    
    case 'player':
    
        $this->redirectTo = '/player';
    
        return $this->redirectTo;
    
        break;
    
    case 'scout':
    
        $this->redirectTo = '/scout';
    
        return $this->redirectTo;
    
        break;
    
    default:
    
       $this->redirectTo = '/login';
    
       return $this->redirectTo;
    
    }
    
    // return $next($request);
    
    }
    
    }
    


    보기 설정



    마지막으로 각 대시보드에 서로 다른 랜딩 페이지를 설정하여 서로 다른 사용자를 표시해 보겠습니다.

    @section('content')
    
    <div class="container">
    
      <div class="row justify-content-center">
    
        <div class="col-md-8">
    
            <div class="card">
    
               <div class="card-header">Dashboard</div>
    
                 <div class="card-body">
    
                  @if (session('status'))
    
                    <div class="alert alert-success" role="alert">
    
                       {{ session('status') }}
    
                    </div>
    
                 @endif
    
                 You are in ADMIN Dashboard!
    
            </div>
    
        </div>
    
       </div>
    
      </div>
    
    </div>
    
    @endsection
    


    위의 코드는 Admin 대시보드의 데모만 보여줍니다. 가능한 한 많은 대시보드를 생성하고 web.php 파일에 적절한 미들웨어가 생성된 경로를 추가할 수 있습니다.

    결론



    쥐를 죽이는 방법에는 여러 가지가 있다는 것을 알고 있습니다. 동일한 문제를 해결하는 방법에 대한 귀하의 생각과 모범 사례를 듣고 싶습니다. 이전에 이 문제를 접한 적이 있다면 어떻게 해결했습니까? 아래 댓글 섹션에서 들어보겠습니다. 그에 따라 이 게시물을 업데이트할 것입니다.

    당신은 전체를 얻을 수 있습니다 source code here

    제 글을 읽어주셔서 감사합니다.

    여기 내 blog 또는 medium에서 백엔드 개발, 디지털 마케팅 및 콘텐츠 관리 시스템에 대해 정기적으로 글을 씁니다.

    2020년 12월 8일 https://masteringbackend.com에서 원래 게시되었습니다.

    좋은 웹페이지 즐겨찾기