라라벨에 기본 포함된 auth 미들웨어를 사용하면 중요한 페이지를 인증을 통하야만 접근 가능하도록 보호할 수 있습니다.

 

다음은 /dashboard 에 연결하기 위해 인증을 확인하는 auth middleware 를 연결하는 예제입니다.

app/Http/routes.php

Route::get('dashboard', ['as' => 'dashboard', 'uses' => 'DashboardController@dashboard', 'middleware' => 'auth]); 
PHP

 

라우팅 그룹에서도 middleware 키워드를 사용하여 전체 그룹에 auth 미들웨어를 적용할 수 있습니다.

Route::group(['prefix' => 'user', 'as' => 'user.', 'middleware' => 'auth'], function () {
	Route::get('view', ['as' => 'view', 'uses' => 'UserController@view']);
});
CODE

 

하지만 모든 페이지가 인증후에만 사용할 수 있다면(예: 기업의 내부 시스템) 모든 라우팅마다 auth middleware 를 거는 것은 매우 번거로운 작업이며 auth 미들웨어 연결 작업을 혹시 빠뜨렸을 경우 인증없이 해당 메뉴에 접근하는 문제가 발생할 수 있습니다.

이를 해결하기 위해 모든 페이지의 인증을 확인하는 global auth middleware 를 만들어 봅시다.

 

artisan 으로 미들웨어 생성

artisan 명령어로 미들웨어를 만들수 있으며 미들웨어 이름은 GlobalAuth 로 생성합니다.

php artisan make:middleware GlobalAuth
CODE

 

미들웨어는 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');
       }
    }
}
CODE

 

미들웨어 등록

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,
    ];
CODE

이제 라우팅에 등록된 auth 미들웨어는 삭제하고 인증이 필요한 메뉴를 브라우저에서 직접 호출하여 로그인 페이지로 포워딩되는지 확인합니다.

 

참고