ProtectedRoute حُرّاس المسارات
آخر تحديث: 2026-11-03
ProtectedRoute حُرّاس المسارات
حارس المسار يفحص الصلاحيات قبل فتح الصفحة: لفّ المسار بـ ProtectedRoute، فإذا لم يكن الزائر مسجّلًا وجّهه إلى /login مع تذكّر الصفحة التي أتى منها، ليعود إليها بعد الدخول. لا يشحن React حارسًا مدمجًا، فتُبنيه من الرسم الشرطي مع Navigate أو useNavigate، ويبقى الحارس مكوّنًا عاديًا يمكن اختباره بمفرده.
| المجموعة | التوجيه وإدارة الحالة |
|---|---|
| النوع | نمط |
ℹ️ ملاحظة يحوّل المحرّر JSX إلى JavaScript ويعرض الواجهة الحقيقية داخل بيئة معزولة؛ تُركَّب المكوّنات تلقائياً دون استدعاء render يدوي.
📝 الصيغة
import { Navigate, Outlet } from 'react-router-dom'
function ProtectedRoute({ isAuth }) {
if (!isAuth) {
// Not signed in: redirect to the login page and remember where we came from
return <Navigate to="/login" replace state={{ from: location.pathname }} />
}
return <Outlet /> // Signed in: render the child routes
}
// Usage:
// <Route element={<ProtectedRoute isAuth={user} />}>
// <Route path="/admin" element={<Admin />} />
// </Route>
⚙️ المعاملات
| isAuth (custom) | فحص الصلاحية: قيمة منطقية، أو مصفوفة أدوار، أو حالة غير متزامنة — ما يوفّره جلستك. |
|---|---|
| redirect (custom) | وجهة المرفوض: عنوان إعادة توجيه أو واجهة تنبيه، تُصمَّم حسب المشروع. |
القيمة المرجعة:لا قيمة مرجعة؛ إنها نمط برمجي وليست واجهة قابلة للاستدعاء.
▶ مثال
المثال يعمل مباشرة: يُعرض تلقائياً عند التوسيع وتظهر التعديلات فوراً.
الناتج:
النقر على «لوحة الإدارة» دون دخول يُحجب ويُرسَل إلى صفحة الدخول؛ والنقر على «سجّل الدخول وعد» يدخل اللوحة — سريان حارس إعادة توجيه Navigate مع العودة بعد الدخول (عرض توضيحي محاكى).
💡 النقاط الأساسية
⚠️ تحذير الحارس الأمامي مجرد طبقة تجربة: تبقى الأصول الثابتة والواجهات متاحة مباشرة، فيجب أن يتحقّق الخادم من الصلاحيات مجددًا لكل بيانات حسّاسة.
💡 نصيحة عند التوجيه احفظ الصفحة المصدر في state (from: location.pathname)، وعد بدقّة بـ navigate(state.from ?? '/home') بعد الدخول.
ℹ️ ملاحظة حين تأتي الصلاحية من طلب غير متزامن (نقطة /me)، أظهر حالة تحميل في الحارس أولًا ثم أخلِّ سبيل الزائر، لئلا تومض صفحة الدخول.
🏷️ المزيد من التوجيه والحالة
💡 حالات ذات صلة
المزيد من الحالات قريباً.
📚 دروس ذات صلة
❓ الأسئلة الشائعة
س بم يختلف مكوّن Navigate عن useNavigate؟
ج يتنقّل Navigate بمجرد رسمه، ما يناسب الفروع التصريحية في JSX، بينما useNavigate دالة أمرّية لردود نداء الأحداث. وكلاهما يفعل الشيء نفسه في العمق.
س كيف أعود إلى الصفحة التي أرادها الزائر؟
ج احفظ state={{ from: location.pathname }} قبل التوجيه، ثم استدعِ navigate(location.state?.from ?? '/home') بعد نجاح الدخول.
س كيف أوسّع هذا لصلاحيات الأدوار (admin/vip)؟
ج استبدل isAuth بفحص دور: اختبر allowedRoles.includes(user.role) داخل الحارس ولفّه بمكوّن RoleRoute لإعادة استخدامه.