جاري التحميل...
جاري التحميل...
clerkMiddleware، auth.protect، الحماية حسب الأدوار
يوفر Clerk نظاماً كاملاً لإدارة المستخدمين يشمل الملفات الشخصية للمستخدمين والمنظمات وإدارة الجلسات.
import { useUser } from '@clerk/nextjs';
function UserProfile() {
const { isLoaded, isSignedIn, user } = useUser();
if (!isLoaded) return <div>جاري التحميل...</div>;
if (!isSignedIn) return null;
return (
<div>
<p>الاسم: {user.fullName}</p>
<p>البريد الإلكتروني: {user.primaryEmailAddress}</p>
</div>
);
}المنظمات تسمح للمستخدمين بالانتماء إلى فرق أو شركات مع تحكم في الوصول بالأدوار.
import { useOrganization } from '@clerk/nextjs';
const { organization } = useOrganization();Webhooks تُبلغ تطبيقك عندما تحدث أحداث في Clerk (إنشاء مستخدم، تحديث، حذف). قم بتكوينها في لوحة التحكم تحت Webhooks.
كيف تصل إلى بيانات المستخدم الحالي في Clerk؟
ما هي المنظمات في Clerk؟
أنشئ صفحة ملف شخصي للمستخدم ونفذ منظمات لإدارة الفريق.
الحل:
// الحل المتوقع لـ proxy.ts
import { clerkMiddleware, createRouteMatcher } from "@clerk/nextjs/server";
const publicRoutes = createRouteMatcher([
"/",
"/sign-in(.*)",
"/sign-up(.*)",
]);
const adminRoutes = createRouteMatcher(["/admin/(.*)"]);
const teacherRoutes = createRouteMatcher(["/teacher/(.*)"]);
const studentRoutes = createRouteMatcher(["/student/(.*)"]);
export default clerkMiddleware(async (auth, req) => {
if (publicRoutes(req)) return;
if (adminRoutes(req)) {
await auth.protect({ role: "org:admin" });
}
if (teacherRoutes(req)) {
await auth.protect({ role: "org:teacher" });
}
if (studentRoutes(req)) {
await auth.protect({ role: "org:student" });
}
});
export const config = {
matcher: [
"/((?!_next|[^?]*\\.(html|css|js|jpg|jpeg|png|gif|svg|ico)$).*)",
"/(api|trpc)(.*)",
],
};الوسيط (proxy.ts):
await auth.protect() - حماية المسارات الأساسيةawait auth.protect({ role: "org:admin" }) - حماية قائمة على الأدوارawait auth.protect({ permission: "org:course:create" }) - حماية قائمة على الأذوناتcreateRouteMatcher() - مطابقة أنماط المساراتمكونات الخادم والإجراءات:
const { userId } = await auth() - جلب معرف المستخدمif (!userId) redirect("/sign-in") - إعادة توجيه إذا لم يكن مسجلاًsessionClaims?.metadata?.role - جلب دور المستخدمالإجابة:
استخدم UserButton component
زر جاهز يعرض معلومات المستخدم وخيارات تسجيل الخروج