인증과 관리자 권한
zenoBlog의 로그인 기능은 Laravel Breeze가 만든 기본 구조를 사용합니다.
관리자 영역은 로그인만으로는 들어갈 수 없고, is_admin 값이 true여야 합니다.
Breeze가 담당하는 것
routes/auth.php에는 인증 관련 라우트가 있습니다.
| URL | 역할 |
|---|---|
/register | 회원가입 |
/login | 로그인 |
/logout | 로그아웃 |
/forgot-password | 비밀번호 재설정 요청 |
/reset-password/{token} | 비밀번호 재설정 |
/verify-email | 이메일 인증 |
/confirm-password | 비밀번호 확인 |
이 파일은 routes/web.php의 마지막에서 불러옵니다.
require __DIR__.'/auth.php';
auth 미들웨어
로그인한 사용자만 접근해야 하는 라우트는 auth 미들웨어로 감쌉니다.
Route::middleware('auth')->group(function () {
Route::get('/profile', [ProfileController::class, 'edit']);
});
로그인하지 않은 사람이 접근하면 로그인 페이지로 보내집니다.
관리자 미들웨어
관리자 페이지는 두 가지 미들웨어를 사용합니다.
Route::middleware(['auth', \App\Http\Middleware\IsAdmin::class])
순서대로 보면 이렇습니다.
auth
-> 로그인했는지 확인
IsAdmin
-> 로그인한 사용자가 관리자인지 확인
IsAdmin 코드
public function handle(Request $request, Closure $next): Response
{
if (!auth()->check() || !auth()->user()->isAdmin()) {
abort(403, '관리자만 접근 가능합니다.');
}
return $next($request);
}
이 코드는 다음 뜻입니다.
로그인 안 했거나
또는
로그인했지만 관리자가 아니면
-> 403 Forbidden
통과하면 컨트롤러로 요청을 넘깁니다.
User 모델의 isAdmin
public function isAdmin(): bool
{
return $this->is_admin === true;
}
users 테이블의 is_admin 값이 true일 때만 관리자입니다.
is_admin 컬럼
마이그레이션으로 users 테이블에 컬럼을 추가했습니다.
$table->boolean('is_admin')->default(false)->after('email');
기본값이 false이기 때문에 새로 가입한 사용자는 기본적으로 관리자가 아닙니다.
화면에서 로그인 상태 확인
레이아웃에서는 @auth를 사용합니다.
@auth
<a href="/admin/posts">관리자</a>
<form action="/logout" method="POST">
@csrf
<button type="submit">로그아웃</button>
</form>
@else
<a href="/login">로그인</a>
@endauth
로그인 상태면 관리자 링크와 로그아웃 버튼을 보여주고, 비로그인 상태면 로그인 버튼을 보여줍니다.
현재 구조에서 주의할 점
헤더의 관리자 링크는 로그인 상태만 확인합니다.
일반 사용자가 로그인하면 관리자 링크가 보일 수 있지만, 실제 /admin 접근은 IsAdmin 미들웨어가 막습니다.
더 깔끔하게 하려면 화면에서도 auth()->user()->isAdmin() 조건을 추가할 수 있습니다.