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 참고[ | ]
편집자 John Jeong Jmnote Jmnote bot
로그인하시면 댓글을 쓸 수 있습니다.