준비작업
이전글에서 작업한 상태까지 설치되어있으면 됩니다.
다시한번 확인하면 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 를 구현하도록 해봤습니다.
여기서는 단순히 일반유저와 관리자구분만을 하였습니다만 실제 어플리케이션에서는 각각의 유저 및 관리자별 권한등을 생각해서 더 복잡하게 개발하게 될겁니다.
'iaa.dev > Laravel8' 카테고리의 다른 글
Laravel 8 Paginator 를 Bootstrap 에서 사용시 (0) | 2022.01.09 |
---|---|
Laravel 8 관리자 화면 - 관리자 및 회원관리 (1) | 2022.01.08 |
Laravel 8 관리자 화면 (Multiple Authentication) - Admin 모델 사용 (12) | 2022.01.07 |
Laravel 8 관리자화면 AdminLTE 인스톨하기 (0) | 2022.01.07 |
Laravel 8 로그인/회원가입(Authentication) - Jetstream (0) | 2022.01.06 |
댓글