본문으로 건너뛰기

인증과 관리자 권한

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() 조건을 추가할 수 있습니다.