유저가 로그인한 후에 마지막 비밀번호 변경일이 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');
}