본문 바로가기
iaa.dev/Laravel8

Laravel 8 관리자 화면 만들기(Multiple Authentication)

by chopper.kid 2022. 1. 6.

준비작업

이전글에서 작업한 상태까지 설치되어있으면 됩니다.

 

Laravel 8 로그인/회원가입(Authentication) - Jetstream

Laravel 로 웹애플리케이션을 만들때 가장 기본인 유저 로그인 / 가입 등의 기능은 이미 다 준비되어 있습니다. Laravel 7 까지는 laravel/ui 를 설치하여 이용하도록 하였고 , 8 부터는 Laravel Jetstream 을

vuxy.tistory.com

다시한번 확인하면 laravel 이 설치되어 있고 , Jetstream 이 설치되어 있으면 필수 패키지는 설치된 셈입니다.

 

users table 에 컬럼 추가

is_admin 컬럼을 users 테이블에 추가합니다. 우선 

php artisan make:migration add_is_admin_to_users_table --table=users

로 database/migrations/2022_xxxxxxxxxx_add_is_admin_to_users_table.php 가 만들어집니다.

이 파일을 열어 다음과 같이 고칩니다.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddIsAdminToUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->boolean('is_admin')->nullable();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('is_admin');
        });
    }
}

그리고 다음을 실행하면 users 테이블에 컬럼이 추가됩니다.

php artisan migrate

그러면 app/Models/User.php 파일의 $fillable property 에 'is_admin' 을 추가합니다.

 

<?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 User extends Authenticatable
{
    use HasApiTokens;
    use HasFactory;
    use HasProfilePhoto;
    use Notifiable;
    use TwoFactorAuthenticatable;

    /**
     * The attributes that are mass assignable.
     *
     * @var string[]
     */
    protected $fillable = [
        'name',
        'email',
        'password',
        'is_admin'  // 여기 추가
    ];

 

미들웨어 설정

php artisan make:middleware Admin

app/Http/Middleware/Admin.php 을 열고 다음과 같이 수정합니다.

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class Admin
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse)  $next
     * @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
     */
    public function handle(Request $request, Closure $next)
    {
        if(Auth::user() !== null && Auth::user()->is_admin == 1){
            return $next($request);
        }
        return redirect(RouteServiceProvider::HOME);
    }
}

app/Http/Kernel.php 에 admin 미들웨어 추가

    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class,
        'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class,

        'admin' => \App\Http\Middleware\Admin::class,
    ];

 

설정파일 작성

.env 파일에 

APP_ADMIN_PREFIX=admin

추가 하고 config/ 폴더에 app_admin.php 파일 생성한후 다음과 같이 수정

<?php

return [

    'prefix' => env('APP_ADMIN_PREFIX', 'admin'), // NEW


];

config/fortify.php 를 수정

//상단에 이걸 추가하고
use Illuminate\Support\Facades\Auth;

//여기를 수정
//    'home' => RouteServiceProvider::HOME,
    'home' => function () {

        if (Auth::user() !== null) {
            if (Auth::user()->is_admin == 1) {
                return '/admin/dashboard';
            } else {
                return '/';
            }
        } else {
            return '/login';
        }
    },

 

관리화면 route 추가  

app/Providers/RouteServiceProvider.php 를 수정

    public function boot()
    {
        $this->configureRateLimiting();

        $this->routes(function () {
            Route::prefix('api')
                ->middleware('api')
                ->namespace($this->namespace)
                ->group(base_path('routes/api.php'));

            Route::middleware('web')
                ->namespace($this->namespace)
                ->group(base_path('routes/web.php'));

			//추가
            Route::prefix(config('app_admin.prefix'))
                ->middleware(['web' ])
                ->namespace($this->namespace)
                ->group(base_path('routes/admin.php'));
        });
    }

그리고 routes/admin.php 생성하고 다음을 추가합니다.

<?php

use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| admin Routes
|--------------------------------------------------------------------------
*/
Route::get('/dashboard', 'App\Http\Controllers\Admin\DashboardController@dashboard')->name('dashboard');

Route::get('/', 'App\Http\Controllers\Admin\DashboardController@dashboard');

 

컨트롤러와 뷰작성

 

app/Http/Admin/DashboardController.php 작성하고 

<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;

class DashboardController extends Controller
{
    public function __construct()
    {
        $this->middleware('admin');

    }
    public function dashboard()
    {
        return view('admin.dashboard');
    }


}

resources/views/admin/dashboard.blade.php 를 만들어 

Welcome to this  admin panel.

를 입력합니다.

 

이제 작업은 다 끝났습니다.

register 버튼 클릭후 유저등록을 두번합니다. 등록후 하나는 phpmyadmin 등을 통해 is_admin 컬럼 값을 1 로 바꿉니다.

각각으로 로그인을 하면 리다이렉트되는 화면이 다른걸 확인할 수 있습니다. 

 

최대한 Laravel 8 과 Jetstream 등의 기능들을 사용하면서 Multi Auth 를 구현하도록 해봤습니다.

여기서는 단순히 일반유저와 관리자구분만을 하였습니다만 실제 어플리케이션에서는 각각의 유저 및 관리자별 권한등을 생각해서 더 복잡하게 개발하게 될겁니다.

 

 

반응형
SMALL

댓글