laravel 전역 인증 middleware 만들기
라라벨에 기본 포함된 auth 미들웨어를 사용하면 중요한 페이지를 인증을 통하야만 접근 가능하도록 보호할 수 있습니다.
다음은 /dashboard 에 연결하기 위해 인증을 확인하는 auth middleware 를 연결하는 예제입니다.
Route::get('dashboard', ['as' => 'dashboard', 'uses' => 'DashboardController@dashboard', 'middleware' => 'auth]);
라우팅 그룹에서도 middleware 키워드를 사용하여 전체 그룹에 auth 미들웨어를 적용할 수 있습니다.
Route::group(['prefix' => 'user', 'as' => 'user.', 'middleware' => 'auth'], function () { Route::get('view', ['as' => 'view', 'uses' => 'UserController@view']); });
하지만 모든 페이지가 인증후에만 사용할 수 있다면(예: 기업의 내부 시스템) 모든 라우팅마다 auth middleware 를 거는 것은 매우 번거로운 작업이며 auth 미들웨어 연결 작업을 혹시 빠뜨렸을 경우 인증없이 해당 메뉴에 접근하는 문제가 발생할 수 있습니다.
이를 해결하기 위해 모든 페이지의 인증을 확인하는 global auth middleware 를 만들어 봅시다.
artisan 으로 미들웨어 생성
artisan 명령어로 미들웨어를 만들수 있으며 미들웨어 이름은 GlobalAuth 로 생성합니다.
php artisan make:middleware GlobalAuth
미들웨어는 app/Middleware/GlobalAuth.php 에 생성됩니다.
미들웨어 구현
GlobalAuth 미들웨어는 Authenticate 미들웨어와 동일한 역할을 수행하지만 차이점은 인증되었거나 요청 url이 'auth/login' 이면 다음으로 진행하는 점입니다.
만약 $request->is("auth/login") 가 빠져 있다면 인증되지 않았으면 redirect()->guest('auth/login'); 로 무한 redirect 되는 문제가 있습니다.
다음과 같이 Authenticate 클래스를 상속받고 handle () 메소드를 재구현합니다.
<?php namespace App\Http\Middleware; use Closure; class GlobalAuth extends Authenticate { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { if ($this->auth->check() or $request->is("auth/login")) { return $next($request); } else { return redirect()->guest('auth/login'); } } }
미들웨어 등록
app/Http/Kernel.php 의 전역 미들웨어 항목인 $middleware 배열에 등록합니다.
class Kernel extends HttpKernel { /** * The application's global HTTP middleware stack. * * @var array */ protected $middleware = [ \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class, \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, // 모두 인증 거쳐야 함. \App\Http\Middleware\GlobalAuth::class, ];
이제 라우팅에 등록된 auth 미들웨어는 삭제하고 인증이 필요한 메뉴를 브라우저에서 직접 호출하여 로그인 페이지로 포워딩되는지 확인합니다.
참고