314 lines
6.9 KiB
Markdown
314 lines
6.9 KiB
Markdown
# 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
|
||
|
||
1. **Kullanıcı Listesi**
|
||
- Tüm kullanıcıları görüntüleme
|
||
- Kullanıcı detayları (email, rol, doğrulama durumu, kayıt tarihi)
|
||
|
||
2. **Rol Yönetimi**
|
||
- Dropdown menüden rol seçerek anında güncelleme
|
||
- Kendi rolünü değiştirememe koruması
|
||
|
||
3. **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ı
|
||
|
||
4. **İstatistikler**
|
||
- Toplam kullanıcı sayısı
|
||
- Admin sayısı
|
||
- Moderatör sayısı
|
||
|
||
## API Endpoint'leri
|
||
|
||
### Admin API
|
||
|
||
#### 1. Kullanıcıları Listele
|
||
```http
|
||
GET /api/v1/admin/users
|
||
Authorization: Bearer <admin_jwt_token>
|
||
```
|
||
|
||
**Response:**
|
||
```json
|
||
{
|
||
"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
|
||
```http
|
||
PATCH /api/v1/admin/users/:id/role
|
||
Authorization: Bearer <admin_jwt_token>
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"role": "moderator"
|
||
}
|
||
```
|
||
|
||
**Response:**
|
||
```json
|
||
{
|
||
"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
|
||
```http
|
||
DELETE /api/v1/admin/users/:id
|
||
Authorization: Bearer <admin_jwt_token>
|
||
```
|
||
|
||
**Response:**
|
||
```json
|
||
{
|
||
"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
|
||
```http
|
||
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
|
||
```http
|
||
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:
|
||
|
||
```sql
|
||
UPDATE "user"
|
||
SET role = 'admin'
|
||
WHERE email = 'your-email@example.com';
|
||
```
|
||
|
||
Veya direkt database üzerinden:
|
||
|
||
```javascript
|
||
// 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
|
||
|
||
1. **Kendi Hesap Koruması**
|
||
- Admin kendi rolünü değiştiremez
|
||
- Admin kendi hesabını silemez
|
||
|
||
2. **Yetkilendirme Kontrolleri**
|
||
- Her endpoint permission kontrolü yapar
|
||
- 401 (Unauthorized): Giriş yapmamış
|
||
- 403 (Forbidden): Yetkisi yok
|
||
|
||
3. **Cascade Silme**
|
||
- Kullanıcı silindiğinde tüm resimleri ve API anahtarları da silinir
|
||
|
||
4. **Role Validasyonu**
|
||
- Sadece geçerli roller kabul edilir
|
||
- Geçersiz rol atama engellenir
|
||
|
||
## Kullanım Örnekleri
|
||
|
||
### JavaScript/TypeScript (Web)
|
||
|
||
```javascript
|
||
// 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
|
||
|
||
```bash
|
||
# 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:
|
||
|
||
```bash
|
||
# Schema'dan migration oluştur
|
||
yarn db:generate
|
||
|
||
# Migration'ı çalıştır
|
||
yarn db:push
|
||
```
|
||
|
||
Veya manuel olarak SQL:
|
||
|
||
```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
|
||
|
||
1. ✅ Role sistemi eklendi
|
||
2. ✅ Permission kontrolleri eklendi
|
||
3. ✅ Admin panel oluşturuldu
|
||
4. ✅ Kullanıcı yönetimi API'leri eklendi
|
||
5. ⏳ Email bildirimleri (rol değişikliği, hesap silme)
|
||
6. ⏳ Audit log sistemi (kim ne yaptı?)
|
||
7. ⏳ Gelişmiş filtreleme (role göre, tarihe göre)
|