diff --git a/src/app.d.ts b/src/app.d.ts index a808988..79a056a 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -12,7 +12,11 @@ declare global { } // interface Error {} - // interface Locals {} + interface Locals { + user?: { + email: string; + } + } // interface PageData {} // interface PageState {} } diff --git a/src/hooks.server.ts b/src/hooks.server.ts new file mode 100644 index 0000000..d9cfcc7 --- /dev/null +++ b/src/hooks.server.ts @@ -0,0 +1,24 @@ +import type { Handle } from '@sveltejs/kit'; +import { dev } from '$app/environment'; + +export const handle: Handle = async ({ event, resolve }) => { + // 拦截 /admin 路由 + if (event.url.pathname.startsWith('/admin')) { + // 读取 Cloudflare Access 提供的 Header + const userEmail = event.request.headers.get('cf-access-authenticated-user-email'); + + // 本地开发环境通过 $app/environment 的 dev 变量来判断 + const isLocalDev = dev; + + if (!userEmail && !isLocalDev) { + return new Response('Unauthorized', { status: 401 }); + } + + // 将用户信息存入 locals,供后续使用 + event.locals.user = { + email: userEmail || 'dev@local.host' + }; + } + + return resolve(event); +}; diff --git a/src/routes/admin/+layout.server.ts b/src/routes/admin/+layout.server.ts new file mode 100644 index 0000000..ec238fd --- /dev/null +++ b/src/routes/admin/+layout.server.ts @@ -0,0 +1,7 @@ +import type { LayoutServerLoad } from './$types'; + +export const load: LayoutServerLoad = async ({ locals }) => { + return { + user: locals.user + }; +}; diff --git a/src/routes/admin/+layout.svelte b/src/routes/admin/+layout.svelte new file mode 100644 index 0000000..13e7abc --- /dev/null +++ b/src/routes/admin/+layout.svelte @@ -0,0 +1,89 @@ + + + + 后台管理 - BlogFlare + + +
+
+ BlogFlare Admin + + +
+
+ +
+
+ {@render children()} +
+
+ +