0%
balqalam Logo
بالقلم
المميزاتالمجتمعالتسعيرالوثائق
تسجيل الدخول
  • مقدمة
  • العرض
  • MVP
  • خارطة الطريق
  • متطلبات المنتج
  • ابدأ الآن
  • البيئة المحلية
  • البنية المعمارية
  • الهيكل
  • الأنماط
  • الحزمة التقنية
  • قاعدة البيانات
  • تعدّد المستأجرين
  • الفهرس (Catalog)
  • العمل دون اتصال
  • المصادقة
  • التهيئة (Onboarding)
  • تدفق التكامل (Integration Flow)
  • التهيئة (Provision)
  • القبول
  • الحضور
  • الامتثال التنظيمي
  • الملف الشخصي
  • الاجتماعات
  • إدارة الرسوم
  • الفاتورة
  • التدويل
  • الترجمة
  • دليل الترجمة
  • أمان قاعدة البيانات
  • المساهمة
  • هَوْغوارتس
  • عرض حي
  • الإلهام
المبيعات والانتشار
  • المبيعات
  • الذهاب إلى السوق
  • التسويق
  • القبول — تسليط الضوء
  • البرنامج التجريبي
  • العملاء المحتملون
  • العرض التجاري
  • قوالب التواصل
  • دراسة الحالة
  • المنافسون
  • نموذج العمل
  • الاقتصاد المشترك
  • الجذب والنمو
التمويل والشراكات
  • الحصول على الدعم
  • عرض المستثمر
  • غرفة البيانات
  • المستثمرون
  • المُسرِّعات
  • الحاضنات
  • المنح
  • الرعاة
  • الشركاء
  • المسابقات والهاكاثونات
  • الجامعات ومراكز التدريب

المصادقة

السابقالتالي

مصادقة متعدّدة المستأجرين مبنية على Auth.js v5 — جلسات، توجيهات، حماية المسارات، وحلّ المستأجر.

تعمل المصادقة على Next.js App Router مع Auth.js (NextAuth v5). يصادق المستخدمون عبر OAuth (Google، Facebook) أو بيانات الاعتماد، مع 2FA اختياري، تحقق من البريد، وإعادة تعيين كلمة المرور. الجلسات هي JWTs محصورة عبر cookies على .databayt.org لتسجيل دخول موحَّد عبر النطاقات الفرعية.

لتفاصيل الموفّر راجع credentials، oauth، وflow diagrams.

نقاط الدخول

#المدخلالمُحفِّزإعادة التوجيه بعد الدخول
1رأس التسويقأيقونة الدخول على ed.databayt.orgDEVELOPER → /dashboard، مستخدم مدرسة → {school}.databayt.org/dashboard، USER → /
2Get StartedCTA تسويقي/login?callbackUrl=/onboarding ثم معالج بـ 15 خطوة
3نطاق فرعي للمدرسة{school}.databayt.org/loginمثل #1، محصور بالمدرسة
4مسار محميURL مباشر/login?callbackUrl={original_url}، يعود بعد المصادقة

دور USER يُعاد توجيهه إلى /{locale} (الصفحة الرئيسية)، لا إلى /onboarding. الـ onboarding متاح فقط عبر callbackUrl صريح.

أولوية إعادة التوجيه

سلسلة القرار في src/auth.ts redirect callback وsrc/components/auth/login/action.ts:

  1. Callback URL — cookie / URL params / baseUrl params (محفوظ عبر OAuth بـ httpOnly cookie)
  2. مسار نسبي صريح من signIn({ redirectTo })
  3. كشف النطاق الفرعي — على نطاق فرعي لمدرسة → لوحة تلك المدرسة
  4. توجيه ذكي — فك JWT، البحث عن المدرسة، التوجيه إلى لوحة المدرسة
  5. احتياطي — لوحة النطاق الرئيسي

الجلسة وJWT

// JWT (jwt callback)
token = {
  id: string
  role: UserRole
  schoolId: string | null
  provider: string
  providerAccountId: string
  sessionToken: string
  updatedAt: number
  hash: string
  exp: number
}
 
// Session (session callback)
session.user = {
  id: string
  email: string
  role: UserRole          // الدور الفعّال — preview إن كان نشطاً
  schoolId: string | null
  isPreviewMode: boolean
}

إعدادات الجلسة: strategy: "jwt"، maxAge: 24 * 60 * 60 (24 ساعة)، updateAge: 5 * 60 (5 دقائق في الإنتاج).

سياق المستأجر

import { getTenantContext } from "@/lib/tenant-context"
 
const { schoolId, requestId, role, isPlatformAdmin } = await getTenantContext()
// الأولوية: cookie الانتحال → header x-subdomain → الجلسة

ذاكرة تخزين مؤقت بطبقتين للنطاق الفرعي → schoolId: Upstash Redis (5 دقائق، مشتركة) → in-memory Map (دقيقة واحدة، حد أقصى 100 إدخال، احتياطي لكل instance). Redis اختياري. التفاصيل الكاملة في تعدد المستأجرين.

الأدوار

enum UserRole {
  DEVELOPER   // 8 - مدير منصة (عابر للمدارس)
  ADMIN       // 7 - مدير مدرسة
  TEACHER     // 6 - كادر تدريسي
  ACCOUNTANT  // 5 - كادر مالي
  STAFF       // 4 - كادر عام
  GUARDIAN    // 3 - ولي أمر
  STUDENT     // 2 - طالب مسجَّل
  USER        // 1 - افتراضي
}

ثمانية أدوار في المجموع. الهرمية في src/lib/school-access.ts؛ يجب أن تبقى متزامنة مع roleRoutes في src/routes.ts. راجع authorization لفحوصات الصلاحيات على مستوى الميزة.

حماية المسارات

Edge middleware يفك JWT، يفحص roleRoutes، يكتشف النطاق الفرعي (نطاق مخصّص → بحث في Redis)، يضبط header x-subdomain للمستهلكين اللاحقين.

// Server component
import { auth } from "@/auth"
 
export default async function ProtectedPage() {
  const session = await auth()
  if (!session) redirect("/login")
  return <Dashboard schoolId={session.user.schoolId} />
}
"use client"
 
import { RoleGate } from "@/components/auth/role-gate"
import { useCurrentRole } from "@/components/auth/use-current-role"
import { useCurrentUser } from "@/components/auth/use-current-user"
 
;<RoleGate allowedRole={UserRole.ADMIN}>
  <AdminPanel />
</RoleGate>

مسارات التسجيل

الخيارالطريقةالحالة
تسجيل ذاتيOAuth (Google/Facebook)يعمل
إنشاء بالجملةالمسؤول يستورد CSV بأدوار مُسبقةيعمل
رموز الانضمامرموز من 6 أحرف (ABCDEFGHJKMNPQRSTUVWXYZ2345679) — 481M تركيبةيعمل
الدعواتروابط دعوة بريدية مع الدورجزئي

مفتاح التسجيل الذاتي: SchoolBranding.allowSelfEnrollment — التفعيل يعطي انضماماً فورياً، التعطيل ينشئ MembershipRequest معلَّقاً.

وضع المعاينة

يتيح للمسؤولين رؤية الواجهة كدور آخر دون تغيير دورهم الفعلي. يستخدم cookies preview-mode وpreview-role؛ session callback يطغى على الدور ويضبط isPreviewMode: true.

Hookيعيد
useEffectiveRoleUserRole — preview إن كان نشطاً، وإلا الفعلي
useIsPreviewModeboolean
useRoleInfo{ actual, preview, effective, isPreviewMode }

الانتحال

يمكن لـ DEVELOPERs انتحال سياقات المدارس لأغراض التصحيح. cookie impersonate_schoolId هو httpOnly، secure، بـ maxAge ساعة واحدة. أحداث IMPERSONATION_STARTED وIMPERSONATION_STOPPED تُسجَّل في التدقيق. الانتحال له الأولوية على كل طرق حلّ المستأجر الأخرى.

انظر أيضاً

  • Credentials
  • OAuth — موفّرون، محوّل متعدّد المستأجرين، cookies عبر النطاقات الفرعية
  • Flow diagrams
  • Onboarding
  • تعدد المستأجرين
العمل دون اتصالالتهيئة (Onboarding)

On This Page

نقاط الدخولأولوية إعادة التوجيهالجلسة وJWTسياق المستأجرالأدوارحماية المساراتمسارات التسجيلوضع المعاينةالانتحالانظر أيضاً

من تطوير Databayt ·

مرحباً بك في بالقلم.

رحلة عظيمة على وشك أن تبدأ.