المسارات المحمية وحواجز المصادقة
أعِد توجيه المستخدمين غير المصادق عليهم إلى تسجيل الدخول باستخدام مكوّنات التغليف أو الحواجز المستندة إلى أدوات التحميل.
المسارات المحمية وحواجز المصادقة درس مجاني في React Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في React Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة React Academy 4 دروس في المجموع.
لماذا نحمي المسارات؟
يجب ألا تكون بعض الصفحات، مثل لوحة المعلومات والملف الشخصي وصفحات الإدارة، متاحة إلا للمستخدمين الذين سجّلوا الدخول. يوفر React Router نهجين لذلك: مكوّنات التغليف والحواجز المعتمدة على loader.
بنية حالة المصادقة
ابدأ بإنشاء سياق للمصادقة يمكن للمكوّنات قراءته لمعرفة ما إذا كان المستخدم قد سجّل الدخول.
const AuthContext = React.createContext(null);
function AuthProvider({ children }) {
const [user, setUser] = useState(null);
const login = async (creds) => { const u = await apiLogin(creds); setUser(u); };
const logout = () => setUser(null);
return (
<AuthContext.Provider value={{ user, login, logout }}>
{children}
</AuthContext.Provider>
);
}
export const useAuth = () => useContext(AuthContext);الحاجز باستخدام مكوّن تغليف
أنشئ مكوّن PrivateRoute يفحص حالة المصادقة ويعيد التوجيه إلى تسجيل الدخول إذا لم يكن المستخدم موثّقًا.
import { Navigate, Outlet } from 'react-router-dom';
function PrivateRoute() {
const { user } = useAuth();
if (!user) return <Navigate to="/login" replace />;
return <Outlet />;
}
// Usage in router:
{ element: <PrivateRoute />, children: [
{ path: '/dashboard', element: <Dashboard /> },
]}الحفاظ على عنوان URL لإعادة التوجيه
خزّن عنوان URL الذي حاول المستخدم الوصول إليه حتى تتمكن من إعادته إليه بعد تسجيل الدخول. مرّره عبر state في مكوّن Navigate.
function PrivateRoute() {
const { user } = useAuth();
const location = useLocation();
if (!user) {
return <Navigate to="/login" state={{ from: location }} replace />;
}
return <Outlet />;
}
// In login handler:
const location = useLocation();
const from = location.state?.from?.pathname || '/';
navigate(from, { replace: true });الحاجز المعتمد على loader (Data Router)
في واجهة Data Router API، أضف فحص المصادقة إلى loader الخاص بالمسار. ارمِ redirect إذا لم يكن المستخدم موثّقًا.
import { redirect } from 'react-router-dom';
function requireAuth() {
const token = localStorage.getItem('token');
if (!token) throw redirect('/login');
return token;
}
const router = createBrowserRouter([
{
path: '/dashboard',
loader: requireAuth,
element: <Dashboard />,
},
]);الحواجز المعتمدة على الدور
وسّع الحاجز ليفحص الأدوار. أعد التوجيه إلى صفحة عدم السماح إذا لم يكن لدى المستخدم الدور المطلوب.
function AdminRoute() {
const { user } = useAuth();
if (!user) return <Navigate to="/login" replace />;
if (user.role !== 'admin') return <Navigate to="/unauthorized" replace />;
return <Outlet />;
}حالة التحميل أثناء فحص المصادقة
إذا حُمّلت حالة المصادقة بشكل غير متزامن، مثلًا من خادم، فاعرض مؤشر تحميل أثناء انتظار الفحص لتجنب ظهور صفحة تسجيل الدخول لفترة وجيزة.
function PrivateRoute() {
const { user, isLoading } = useAuth();
if (isLoading) return <Spinner />;
if (!user) return <Navigate to="/login" replace />;
return <Outlet />;
}حماية عدة مسارات دفعة واحدة
اجمع جميع المسارات المحمية ضمن غلاف PrivateRoute واحد حتى لا تكرر الحاجز لكل مسار على حدة.
const router = createBrowserRouter([
{ path: '/login', element: <Login /> },
{
element: <PrivateRoute />,
children: [
{ path: '/dashboard', element: <Dashboard /> },
{ path: '/profile', element: <Profile /> },
{ path: '/settings', element: <Settings /> },
],
},
]);التعامل مع انتهاء صلاحية الرمز
افحص انتهاء صلاحية الرمز داخل الحاجز أو في معترض عام، وسجّل خروج المستخدم عند انتهاء صلاحيته، مع إعادة توجيهه إلى تسجيل الدخول.
function isTokenValid(token) {
const payload = JSON.parse(atob(token.split('.')[1]));
return payload.exp * 1000 > Date.now();
}
function requireAuth() {
const token = localStorage.getItem('token');
if (!token || !isTokenValid(token)) throw redirect('/login');
return token;
}آلية عمل رمز التحديث
قبل إعادة التوجيه عند تلقي 401، حاول تحديث الرمز. ولا تعِد التوجيه إلى تسجيل الدخول إلا إذا فشل التحديث أيضًا.
async function requireAuth() {
let token = localStorage.getItem('token');
if (!token || isExpired(token)) {
token = await refreshToken();
if (!token) throw redirect('/login');
localStorage.setItem('token', token);
}
return token;
}استمرار المصادقة بعد إعادة التحميل
خزّن رمز المصادقة في localStorage أو في ملف تعريف ارتباط HttpOnly. وعند تحميل التطبيق، أعد تهيئة حالة المصادقة قبل عرض المسارات المحمية.
تحقق سريع
عند استخدام حاجز مصادقة قائم على loader في React Router، ما الذي يجب أن ترميه لإعادة توجيه مستخدم غير موثّق؟
مراجعة
احمِ المسارات باستخدام غلاف PrivateRoute يعتمد على <Outlet />، أو باستخدام loader يرمي redirect(). حافظ على عنوان URL المقصود في حالة التنقل، وتعامل مع حالات التحميل لتجنب الظهور الومضي، واجمع المسارات المحمية لتجنب التكرار.
الأسئلة الشائعة
هل درس «المسارات المحمية وحواجز المصادقة» مجاني؟
نعم — نص درس «المسارات المحمية وحواجز المصادقة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة React Academy، انتقل إلى CoddyKit PRO. تتضمن دورة React Academy 4 دروس في المجموع.
ماذا ستتعلم في «المسارات المحمية وحواجز المصادقة»؟
أعِد توجيه المستخدمين غير المصادق عليهم إلى تسجيل الدخول باستخدام مكوّنات التغليف أو الحواجز المستندة إلى أدوات التحميل. تتمرن على React Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ React Academy؟
لا تُشترط خبرة سابقة. React Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.
كم من الوقت يستغرق درس «المسارات المحمية وحواجز المصادقة»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس React Academy هذا؟
نعم. كل درس في React Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المسارات المتداخلة وتخطيطات Outlet
- أدوات التحميل والإجراءات (واجهة Data Router)
- المسارات المحمية وحواجز المصادقة
- إدارة الحالة في معاملات البحث ضمن URL