Gereksinimler ve Ön Hazırlık
Bu uygulamayı hayata geçirmek için bilgisayarınızda Node.js'in güncel bir sürümünün (v20+) yüklü olması gerekir. Projenizi oluştururken Vite kullanmanızı öneririz; çünkü Vite, hızlı derleme süresi ve modern yapılandırmasıyla 2026 yılında React geliştirme süreçlerinin standartıdır.
- Node.js v20 veya üzeri
- React 19 ve üzeri
- React Router 7 (veya en güncel sürüm)
- Temel JavaScript (ES6+) ve React Hooks bilgisi
Projeyi başlatmak için terminalinize npm create vite@latest my-auth-app -- --template react komutunu girerek kurulumu tamamlayabilirsiniz.
Adım 1: Yetkilendirme Bağlamını (AuthContext) Oluşturma
Uygulamanızın genelinde kullanıcı bilgilerini ve rolünü paylaşmak için React Context API'yi kullanacağız. Bu, her bileşene prop geçme (prop drilling) sorununu ortadan kaldırır. Aşağıdaki kod, kullanıcı giriş durumunu ve rolünü saklayan merkezi bir yapı kurar.
import { createContext, useContext, useState } from 'react';
const AuthContext = createContext(null);
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState(null); // { name: 'Ali', role: 'admin' }
const login = (userData) => setUser(userData);
const logout = () => setUser(null);
return (
{children}
);
};
export const useAuth = () => useContext(AuthContext);
Bu kod bloğu, uygulamanın en üst seviyesinde kullanılacak bir sağlayıcı oluşturur. useAuth kancası sayesinde, uygulamanın herhangi bir yerinde user nesnesine erişerek kullanıcının rolünü kontrol edebiliriz.
Adım 2: Korunan Rota (Protected Route) Bileşenini Geliştirme
Yetkilendirme sisteminin kalbi, belirli sayfaları koruyan "Protected Route" bileşenidir. Bu bileşen, kullanıcının giriş yapıp yapmadığını ve gerekli role sahip olup olmadığını kontrol eder. Eğer kullanıcı yetkisizse, onu giriş sayfasına veya ana sayfaya yönlendiririz.
import { Navigate } from 'react-router-dom';
import { useAuth } from './AuthContext';
const ProtectedRoute = ({ children, allowedRoles }) => {
const { user } = useAuth();
if (!user) {
return ;
}
if (allowedRoles && !allowedRoles.includes(user.role)) {
return Bu sayfaya erişim yetkiniz yok.;
}
return children;
};
Burada allowedRoles parametresi, o sayfaya giriş yapabilecek rollerin listesini alır. Eğer kullanıcının rolü bu listede yoksa, kullanıcıya erişim engeli mesajı gösterilir.
Adım 3: React Router İle Rotaları Yapılandırma
Şimdi oluşturduğumuz bileşenleri kullanarak rotalarımızı tanımlayalım. Bu aşamada, hangi sayfanın hangi role açık olduğunu belirlemek, uygulamanın güvenlik mimarisini netleştirir.
import { BrowserRouter, Routes, Route } from 'react-router-dom';
const App = () => (
);
Bu yapılandırma ile /admin rotasına sadece 'admin' rolüne sahip kullanıcılar erişebilir. /dashboard rotası ise hem 'admin' hem de 'editor' rollerine açıktır.
Adım 4: Bileşen Seviyesinde Yetkilendirme Kontrolü
Bazen tüm sayfayı değil, sadece sayfa içindeki bir butonu veya bölümü belirli rollere göre göstermek istersiniz. Bunun için yardımcı bir bileşen oluşturmak oldukça pratiktir.
const RoleBasedComponent = ({ role, children }) => {
const { user } = useAuth();
if (user?.role === role) {
return {children};
}
return null;
};
// Kullanımı:
//
// Kullanıcıyı Sil
//
Bu yöntem, arayüzde gereksiz butonların görünmesini engelleyerek kullanıcı deneyimini iyileştirir ve "yetersiz yetki" hatalarını önceden engeller.
Yetkilendirme Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Context API | Hızlı, kurulumu kolay, küçük/orta projeler için ideal. | Çok büyük projelerde performans yönetimi zordur. |
| Redux/Zustand | Merkezi ve öngörülebilir durum yönetimi sağlar. | Ekstra kütüphane bağımlılığı ve kurulum maliyeti. |
| Sunucu Tarafı (SSR) | En güvenli yöntemdir, veri sızıntısını engeller. | Daha karmaşık mimari gerektirir. |
Güvenlik ve En İyi Pratikler
Kritik Uyarı: İstemci tarafındaki (React) yetkilendirme, kullanıcı deneyimini iyileştirmek içindir; gerçek güvenlik değildir. Tüm yetkilendirme kontrolleri mutlaka arka uç (backend) API'nizde de tekrarlanmalıdır. Kullanıcı, tarayıcı konsolu üzerinden React kodunuzu değiştirebilir; bu nedenle API yanıtlarını her zaman rol bazlı filtreleyin.
Güvenlik için dikkat etmeniz gereken diğer hususlar şunlardır:
- JWT (JSON Web Token) kullanıyorsanız, token'ı güvenli bir şekilde saklayın (HttpOnly çerezler tercih edilir).
- API'den gelen verileri her zaman doğruluğunu kontrol ederek işleyin.
- XSS (Cross-Site Scripting) saldırılarına karşı kullanıcı girdilerini her zaman temizleyin (sanitize).
Sıkça Sorulan Sorular
React'te rol değişikliği olduğunda sayfa otomatik güncellenir mi?
Evet, AuthContext üzerinde tutulan user durumu değiştiğinde, React'in reaktif yapısı sayesinde tüm bileşenler otomatik olarak yeniden render edilir ve yetki kontrolleri güncellenir.
Kullanıcı sayfayı yenilediğinde rol bilgisi kayboluyor, ne yapmalıyım?
Kullanıcı bilgilerini localStorage veya sessionStorage içerisinde saklayıp, uygulamanın başlangıcında useEffect kancası ile bu bilgiyi tekrar yükleyerek oturumu kalıcı hale getirebilirsiniz.
Backend ile entegrasyonu nasıl kurmalıyım?
Kullanıcı giriş yaptığında backend'den gelen rol bilgisini AuthContext'e kaydedin. API isteklerinizde her zaman bu rol bilgisini içeren token'ı "Authorization" başlığında gönderin.
Birden fazla rolü olan kullanıcılar için ne yapmalıyım?
allowedRoles dizisini kontrol ederken .some() metodunu kullanarak kullanıcının rollerinden herhangi birinin izin verilenler arasında olup olmadığını kolayca kontrol edebilirsiniz.
Bu sistem SEO'yu etkiler mi?
İstemci tarafında yapılan bu kontroller, arama motoru botlarının içeriği görmesini engelleyebilir. Eğer SEO kritik ise, sunucu tarafında işleme (SSR) veya statik site üretimi (SSG) yöntemlerini değerlendirmelisiniz.
Yetkilendirme Sisteminde Performans Optimizasyonu ve Önbellekleme
Büyük ölçekli React uygulamalarında, her rota geçişinde veya bileşen render işleminde yetkilendirme kontrolü yapmak, özellikle karmaşık rol hiyerarşilerinde performans darboğazlarına yol açabilir. Bu süreci optimize etmek için useMemo ve useCallback kancalarını stratejik olarak kullanmalısınız.
Kullanıcı rolü ve izinleri genellikle statik olduğu için, bu verileri her render döngüsünde yeniden hesaplamak yerine önbelleğe almak (memoization) gereklidir. Aşağıdaki örnek, izin kontrol fonksiyonunun gereksiz yere tekrar çalışmasını nasıl engelleyeceğinizi göstermektedir:
import { useMemo } from 'react';
const useAuthCheck = (userRole, requiredRole) => {
return useMemo(() => {
console.log("İzin kontrolü hesaplanıyor...");
return userRole === requiredRole;
}, [userRole, requiredRole]);
};
Ayrıca, büyük uygulamalarda yetkilendirme verilerini localStorage yerine sessionStorage veya daha güvenli olan HttpOnly Cookie yapısında tutmak, hem güvenlik hem de performans açısından daha verimli sonuçlar verir. Context API kullanırken, sağlayıcı (Provider) bileşeninizin gereksiz yere tüm alt ağacı güncellememesi için React.memo ile sarmalanmış bileşenler kullanmayı ihmal etmeyin.
Yetkilendirme Süreçleri İçin Test Stratejileri
Role dayalı bir sistemde en kritik hata, yanlış rolün yetkisiz bir sayfaya erişebilmesidir. Bu durumu engellemek için birim (unit) ve entegrasyon testleri hayati önem taşır. Jest ve React Testing Library kullanarak, rotaların koruma altında olup olmadığını şu şekilde test edebilirsiniz:
import { render, screen } from '@testing-library/react';
import { MemoryRouter } from 'react-router-dom';
import ProtectedRoute from './ProtectedRoute';
test('Yetkisiz kullanıcı korunan rotaya erişememeli', () => {
render(
Admin Paneli
);
expect(screen.queryByText(/Admin Paneli/i)).not.toBeInTheDocument();
});
Test süreçlerinizde şu senaryoları mutlaka kapsayın:
- Geçersiz Token Durumu: Süresi dolmuş veya manipüle edilmiş token ile erişim denemesi.
- Rol Değişimi: Kullanıcının rolü anlık olarak değiştiğinde (örneğin bir ödeme sonrası) arayüzün anında güncellenmesi.
- Hata Sayfaları: Yetkisiz erişim denemelerinde kullanıcıyı 403 (Forbidden) sayfasına yönlendirme mantığının doğruluğu.
Bu testleri CI/CD süreçlerinize dahil ederek, kod tabanınız büyüdükçe yetkilendirme mantığınızın bozulmadığından emin olabilirsiniz. Unutmayın, güvenlik bir özellik değil, bir süreçtir.
Sonuç
React ile role dayalı yetkilendirme sistemi kurmak, uygulamanızın güvenliğini ve profesyonelliğini bir üst seviyeye taşır. Bu rehberde öğrendiğiniz Context API kullanımı, korunan rotalar ve bileşen bazlı kısıtlamalar, ölçeklenebilir bir mimarinin temel taşlarıdır. Bir sonraki adım olarak, bu yetkilendirme sistemini bir backend servisi (Node.js/Express veya Firebase Auth gibi) ile entegre ederek uçtan uca güvenli bir süreç oluşturmayı deneyebilirsiniz.
Yasal Uyarı: Bu makalede yer alan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka güvenlik testlerini yapın ve hassas verilerin korunması için profesyonel güvenlik standartlarına uygun kütüphaneler kullanın.

Yorumlar (0)
Yorum Yaz