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
+
+
+
+
+
+
+ {@render children()}
+
+
+
+