6.9 KiB
6.9 KiB
Admin Panel & Role-Based Access Control (RBAC)
Genel Bakış
Bu proje artık kapsamlı bir rol tabanlı erişim kontrol (RBAC) sistemine sahiptir. Kullanıcılar rollere atanabilir ve bu roller belirli izinler sağlar.
Roller
1. User (Varsayılan)
- Sadece kendi resimlerini yükleyebilir
- Sadece kendi resimlerini görebilir
- Sadece kendi resimlerini silebilir
2. Moderator
- Kendi resimlerini yükleyebilir
- TÜM kullanıcıların resimlerini görebilir
- TÜM resimleri silebilir
- Moderasyon yetkisi
3. Admin
- TÜM moderator izinlerine sahiptir
- Kullanıcıları yönetebilir (listeleme, silme)
- Kullanıcı rollerini değiştirebilir
- Tam sistem kontrolü
İzinler
| İzin | User | Moderator | Admin |
|---|---|---|---|
IMAGE_UPLOAD |
✅ | ✅ | ✅ |
IMAGE_VIEW_OWN |
✅ | ✅ | ✅ |
IMAGE_VIEW_ANY |
❌ | ✅ | ✅ |
IMAGE_DELETE_OWN |
✅ | ✅ | ✅ |
IMAGE_DELETE_ANY |
❌ | ✅ | ✅ |
USER_VIEW |
❌ | ❌ | ✅ |
USER_DELETE |
❌ | ❌ | ✅ |
USER_MANAGE_ROLES |
❌ | ❌ | ✅ |
USER_MANAGE_PERMISSIONS |
❌ | ❌ | ✅ |
USER_MANAGE_API_KEYS |
❌ | ❌ | ✅ |
Admin Panel
Admin paneline erişim: http://localhost:3000/admin
Özellikler
-
Kullanıcı Listesi
- Tüm kullanıcıları görüntüleme
- Kullanıcı detayları (email, rol, doğrulama durumu, kayıt tarihi)
-
Rol Yönetimi
- Dropdown menüden rol seçerek anında güncelleme
- Kendi rolünü değiştirememe koruması
-
Kullanıcı Silme
- Kullanıcıyı ve tüm verilerini silme
- Kullanıcının resimleri ve API anahtarları da silinir
- Kendi hesabını silememe koruması
-
İstatistikler
- Toplam kullanıcı sayısı
- Admin sayısı
- Moderatör sayısı
API Endpoint'leri
Admin API
1. Kullanıcıları Listele
GET /api/v1/admin/users
Authorization: Bearer <admin_jwt_token>
Response:
{
"success": true,
"data": {
"users": [
{
"id": "user-id",
"name": "John Doe",
"email": "john@example.com",
"role": "user",
"emailVerified": true,
"createdAt": "2024-01-01T00:00:00.000Z"
}
],
"total": 1
}
}
2. Kullanıcı Rolünü Değiştir
PATCH /api/v1/admin/users/:id/role
Authorization: Bearer <admin_jwt_token>
Content-Type: application/json
{
"role": "moderator"
}
Response:
{
"success": true,
"message": "Kullanıcı rolü başarıyla güncellendi",
"data": {
"userId": "user-id",
"newRole": "moderator"
}
}
Koşullar:
- Sadece admin yetkisi
- Kendi rolünü değiştiremez
- Geçerli roller:
user,moderator,admin
3. Kullanıcı Sil
DELETE /api/v1/admin/users/:id
Authorization: Bearer <admin_jwt_token>
Response:
{
"success": true,
"message": "Kullanıcı başarıyla silindi",
"data": {
"deletedUserId": "user-id",
"deletedUser": "user@example.com"
}
}
Koşullar:
- Sadece admin yetkisi
- Kendi hesabını silemez
- Kullanıcının tüm resimleri ve API anahtarları da silinir
Güncellenmiş Resim API'leri
1. Resimleri Listele
GET /api/v1/images
Authorization: Bearer <jwt_token>
Davranış:
- User: Sadece kendi resimlerini görür
- Moderator/Admin: TÜM resimleri görür
2. Resim Sil
DELETE /api/v1/images/:id
Authorization: Bearer <jwt_token>
Davranış:
- User: Sadece kendi resimlerini silebilir
- Moderator/Admin: Herhangi bir resmi silebilir
İlk Admin Oluşturma
Veritabanında manuel olarak ilk admin kullanıcısını oluşturun:
UPDATE "user"
SET role = 'admin'
WHERE email = 'your-email@example.com';
Veya direkt database üzerinden:
// Drizzle Studio veya migration ile
import { db } from "./db";
import { user } from "./db/schema";
import { eq } from "drizzle-orm";
await db.update(user)
.set({ role: "admin" })
.where(eq(user.email, "your-email@example.com"));
Güvenlik Özellikleri
-
Kendi Hesap Koruması
- Admin kendi rolünü değiştiremez
- Admin kendi hesabını silemez
-
Yetkilendirme Kontrolleri
- Her endpoint permission kontrolü yapar
- 401 (Unauthorized): Giriş yapmamış
- 403 (Forbidden): Yetkisi yok
-
Cascade Silme
- Kullanıcı silindiğinde tüm resimleri ve API anahtarları da silinir
-
Role Validasyonu
- Sadece geçerli roller kabul edilir
- Geçersiz rol atama engellenir
Kullanım Örnekleri
JavaScript/TypeScript (Web)
// Admin paneline giriş (token localStorage'da saklanıyor)
const token = localStorage.getItem("token");
// Kullanıcıları listele
const response = await fetch("/api/v1/admin/users", {
headers: {
Authorization: `Bearer ${token}`,
},
});
const { data } = await response.json();
console.log(data.users);
// Rol değiştir
await fetch("/api/v1/admin/users/user-id/role", {
method: "PATCH",
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${token}`,
},
body: JSON.stringify({ role: "moderator" }),
});
// Kullanıcı sil
await fetch("/api/v1/admin/users/user-id", {
method: "DELETE",
headers: {
Authorization: `Bearer ${token}`,
},
});
cURL
# Kullanıcıları listele
curl -H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
http://localhost:3000/api/v1/admin/users
# Rol değiştir
curl -X PATCH \
-H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{"role":"moderator"}' \
http://localhost:3000/api/v1/admin/users/USER_ID/role
# Kullanıcı sil
curl -X DELETE \
-H "Authorization: Bearer YOUR_ADMIN_TOKEN" \
http://localhost:3000/api/v1/admin/users/USER_ID
Migration
Role field'ını veritabanına eklemek için:
# Schema'dan migration oluştur
yarn db:generate
# Migration'ı çalıştır
yarn db:push
Veya manuel olarak SQL:
ALTER TABLE "user"
ADD COLUMN IF NOT EXISTS role TEXT DEFAULT 'user';
Dosya Yapısı
app/
├── lib/
│ ├── permissions.ts # RBAC sistem tanımları
│ └── api-auth.ts # Auth middleware (role içerir)
├── api/
│ └── v1/
│ └── admin/
│ └── users/
│ ├── route.ts # GET (list)
│ └── [id]/
│ ├── route.ts # DELETE
│ └── role/
│ └── route.ts # PATCH
└── admin/
└── page.tsx # Admin panel UI
Sonraki Adımlar
- ✅ Role sistemi eklendi
- ✅ Permission kontrolleri eklendi
- ✅ Admin panel oluşturuldu
- ✅ Kullanıcı yönetimi API'leri eklendi
- ⏳ Email bildirimleri (rol değişikliği, hesap silme)
- ⏳ Audit log sistemi (kim ne yaptı?)
- ⏳ Gelişmiş filtreleme (role göre, tarihe göre)