사용자 정의 Middleware 만들고 적용하기

inhalin·2022년 7월 13일
0

Laravel

목록 보기
6/7

Middleware 만들고 적용하기

상황 가정

유저가 로그인한 후에 마지막 비밀번호 변경일이 6개월 전이면 비밀번호 변경 페이지로 이동시켜주려고 한다. 로그인에 성공하면 해당 미들웨어를 타서 비밀번호 변경일을 체크해준다. 변경일 비교 기간은 config 파일에서 지정해준다.

구현

먼저, config\auth.php에 아래 코드를 추가해서 비교기간을 설정해준다.

return [
    // 생략
    'password_expired' => 6,
];

이제 artisan 명령어로 미들웨어를 만들어주고,

php artisan make:middleware PasswordExpiredMiddleware

미들웨어가 동작하게 하려면 app\Http\Kernel.php에 등록해주어야 한다.

protected $routeMiddleware = [
    // 생략
    'password_expired' => \App\Http\Middleware\PasswordExpiredMiddleware::class,
];

routes\web.php에서 만들어준 미들웨어를 사용할 라우트를 설정해준다.

// 로그인
Route::post('/auth/login', 'AuthController@login')->middleware('password_expired');

// 비밀번호 변경
Route::get('/auth/expired', 'PasswordExpiredController@expired')->name('password.expired');

아까 만든 미들웨어를 보면 request가 실행되기 전에 미들웨어에서 무언가를 해주도록 되어있다.

public function handle(Request $request, Closure $next)
{
    // Perform action

    return $next($request);
}

지금은 로그인이 이루어진 후에 미들웨어에서 다른 작업을 해주어야 하기 때문에 기본 구조를 아래와 같이 바꾸어주면 된다.

public function handle($request, Closure $next)
{
    $response = $next($request);
 
    // Perform action
 
    return $response;
}

이제 $request에 로그인된 회원의 정보가 담겨 있다. 회원의 비밀번호 변경일을 현재 시점과 비교해서 6개월 이상 지난 경우 비밀번호 변경 페이지로 리다이렉트 시켜준다. 위쪽 코드의 주석처리된 부분에 코드를 작성해주면 된다.

$user = $request->user();

if ($user->passwordExpired($user)) {
    return redirect()->route('password.expired');
}

나는 비밀번호 변경일 체크하는 로직을 User 모델에 넣어주었다. 이렇게 하면 나중에 조건이 변경될 경우에 User 모델에 있는 코드만 변경하면 된다.

public function passwordExpired($user)
{
    $passwordChangedAt = new Carbon($user->password_changed_at ?? $user->created_at);

    return Carbon::now()->diffInMonths($passwordChangedAt) >= config('auth.password_expired');
}

0개의 댓글