Laravel 미들웨어

1 개요[ | ]

Laravel Middleware
라라벨 미들웨어
  • 요청을 필터링하는 메커니즘 제공
  • 애플리케이션에 대한 관문 역할을 함
  • 인증 여부 확인, 공통기능 적용 등의 처리를 위임할 수 있음
  • 사용자의 인증 여부를 미들웨어에서 선 검증 후 결과에 따라 가입창으로 리다이렉트하는 경우가 대표적인 예

2 라우트에 미들웨어 지정[ | ]

  • app/Http/Kernel.php$routeMiddleware 속성의 키 값을 사용
  • HTTP kernel에 미들웨어가 있다면 middleware 키 값을 사용하여 라우트에 지정 가능
PHP
Copy
// app/Http/Kernal.php
// 등록되어 있는 미들웨어
protected $routeMiddleware = [
    'auth' => \App\Http\Middleware\Authenticate::class,
    'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
    'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
    'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
];
PHP
Copy
// middleware 키 사용
// App\Http\Kernel 클래스의 $routeMiddleware의 키 값 지정
Route::get('admin/profile', ['middleware' => 'auth', function () {
    //
}]);

3 Middleware/Authenticate.php 설명[ | ]

PHP
Copy
<?php

namespace App\Http\Middleware;

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

class Authenticate
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @param  string|null  $guard
     * @return mixed
     */
    public function handle($request, Closure $next, $guard = null)
    {
        if (Auth::guard($guard)->guest()) { // 접근 사용자가 손님이라면
            if ($request->ajax() || $request->wantsJson()) {
                return response('Unauthorized.', 401);
            } else {
                return redirect()->guest('login'); // 로그인 페이지로 리다이렉트
            }
        }

        return $next($request);
    }
}

4 Middleware/Authenticate.php 실험[ | ]

  • routes.php 파일에 authenticate.php 미들웨어를 적용하여 로그인 상태에 따른 접근을 테스트해본다.
PHP
Copy
Route::group(['middleware' => 'web'], function () {
    Route::auth();
    Route::get('/home', 'HomeController@index');

    Route::get('/access', function() { // authenticate.php 미들웨어를 적용
        echo "You have an access";
    })->middleware('auth');
});

5 AdminMiddleware 만들기[ | ]

  • DB의 users 테이블에 admin 필드를 추가한다.
Console
Copy
mysql> desc users;
+----------------+------------------+------+-----+---------+----------------+
| Field          | Type             | Null | Key | Default | Extra          |
+----------------+------------------+------+-----+---------+----------------+
| id             | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name           | varchar(255)     | NO   |     | NULL    |                |
| email          | varchar(255)     | NO   | UNI | NULL    |                |
| password       | varchar(60)      | NO   |     | NULL    |                |
| remember_token | varchar(100)     | YES  |     | NULL    |                |
| created_at     | timestamp        | YES  |     | NULL    |                |
| updated_at     | timestamp        | YES  |     | NULL    |                |
| admin          | tinyint(1)       | NO   |     | 0       |                |
+----------------+------------------+------+-----+---------+----------------+
8 rows in set (0.00 sec)
  • artisan 명령으로 middleware 기본 템플릿을 생성
Console
Copy
php artisan make:middleware AdminMiddleware
  • Middleware/AdminMiddleware.php가 생성됨
PHP
Copy
<?php

namespace App\Http\Middleware;

use Closure;

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return $next($request);
    }
}
  • Middleware/AdminMiddleware.php를 아래 코드와 같이 수정
PHP
Copy
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Support\Facades\Auth; // Auth 클래스 사용을 위해 추가

class AdminMiddleware
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if (!Auth::guest() && Auth::user()->admin) // guest가 아니고 현재 사용자가 admin 인지를 판단 
        {
            return $next($request); // 다음 이벤트로 넘긴다
        }
        return redirect('/home'); // Admin이 아니므로 home으로 되돌린다.
    }
}
  • routes.php에 isAdmin 키 값을 가지는 라우트를 추가
PHP
Copy
Route::group(['middleware' => 'web'], function () {
    Route::auth();
    Route::get('/home', 'HomeController@index');
    Route::Get('/access', function() {
    	echo "You are an administrator";
    })->middleware('isAdmin');
});
  • Kernel.php의 $routeMiddleware에 isAdmin 카를 가지는 항목을 추가해준다.
PHP
Copy
    protected $routeMiddleware = [
        'auth' => \App\Http\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'isAdmin' => \App\Http\Middleware\AdminMiddleware::class, // isAdmin키 값을 가지는 AdminMiddlware를 추가
    ];
  • DB의 users 테이블 admin 필드값을 1과 0으로 바꿔가면서 localhost:8000/access 로 접근 시험 확인

6 같이 보기[ | ]

7 참고[ | ]