# User Permissions: Editör Grupları & Yetkiler

TYPO3'te backend kullanıcı grupları oluşturma, yetki yönetimi ve TSconfig ile kısıtlama — bu projede yapılan yapılandırmalar dahil.

---

## Kullanıcı Hiyerarşisi

```
System Maintainer  (en yüksek — Install Tool erişimi)
    └── Admin User  (tüm backend erişimi)
        └── Site Yöneticisi Grubu  (geniş yetkiler, kullanıcı oluşturamaz)
            └── İçerik Editörü Grubu  (sadece içerik düzenleme)
                └── Haber Editörü Grubu  (sadece news kayıtları)
```

**Altın Kural:** Her grup sadece işi için gereken minimum yetkiyi alır.

---

## Bu Projede Yapılan Yapılandırmalar ✓

| Dosya | Açıklama |
|-------|----------|
| `packages/testproject/Configuration/user.tsconfig` | Global editör ayarları (tüm kullanıcılar) |
| `Configuration/Sets/…/UserGroups/content-editor.tsconfig` | İçerik editörü grup TSconfig'i |
| `Configuration/Sets/…/UserGroups/news-editor.tsconfig` | Haber editörü grup TSconfig'i |
| `packages/testproject/ext_localconf.php` | `user.tsconfig` kaydı |
| `config/system/additional.php` | Varsayılan sayfa izinleri |

---

---

## Kullanıcı Grubu Oluşturma (Backend Adımları)

**System → Backend Users → Backend User Groups → + (Yeni)**

### Grup 1: İçerik Editörü

| Alan | Değer |
|------|-------|
| **Title** | İçerik Editörü |
| **Description** | Sayfa içeriklerini düzenler, yeni sayfa oluşturamaz |

**Access Lists → Modules:**
```
✅ Web > Page
✅ Web > View
✅ Web > List
✅ File > Filelist
❌ Admin Tools (tümü kapalı)
❌ System (tümü kapalı)
❌ Site Management (kapalı)
```

**Access Lists → Tables (listing):**
```
✅ pages
✅ tt_content
✅ sys_file_reference
✅ sys_category
✅ tx_news_domain_model_news  (news extension varsa)
```

**Access Lists → Tables (modify):**
```
✅ tt_content
✅ sys_file_reference
❌ pages  (yeni sayfa oluşturmasın, sadece içerik)
```

**Access Lists → Page types:**
```
✅ Standard (1)
✅ Shortcut (4)
❌ Diğerleri
```

**Access Lists → Allowed languages:**
```
✅ Tüm diller  (veya sadece gerekli dil)
```

**TSconfig alanına yapıştır** (içerik-editörü TSconfig dosyasından):
```typoscript
options.clearCache.pages = 1
options.clearCache.all = 0

TCEFORM.tt_content.CType {
    keepItems = textmedia,text,header,html,list,mask_teaser,mask_hero
}

TCEFORM.pages.doktype {
    keepItems = 1,4
}

mod.web_list {
    hideTables = sys_template,sys_domain,be_users,be_groups
}

options.defaultUploadFolder = 1:/user_uploads/content/
```

---

### Grup 2: Haber Editörü

| Alan | Değer |
|------|-------|
| **Title** | Haber Editörü |
| **Description** | Sadece news kayıtlarını ve haber sayfalarını yönetir |

**Access Lists → Modules:**
```
✅ Web > Page
✅ Web > View
✅ Web > List
✅ File > Filelist
❌ System (kapalı)
```

**Access Lists → Tables:**
```
(listing & modify)
✅ tt_content
✅ tx_news_domain_model_news
✅ tx_news_domain_model_category
✅ sys_file_reference
```

**TSconfig alanına yapıştır:**
```typoscript
options.clearCache.pages = 1
options.clearCache.all = 0

TCEFORM.tt_content.CType {
    keepItems = textmedia,text,header,list
}

TCEFORM.pages.doktype {
    keepItems = 1,4
}

mod.web_list {
    hideTables = sys_template,sys_domain,be_users,be_groups
}

options.defaultUploadFolder = 1:/user_uploads/news/
```

---

### Grup 3: Site Yöneticisi

| Alan | Değer |
|------|-------|
| **Title** | Site Yöneticisi |
| **Description** | Geniş yetkiler — admin değil |

**Access Lists → tüm web, file modülleri açık**
**Tables → modify: pages, tt_content, sys_file_reference, sys_redirect dahil**

**TSconfig alanına:**
```typoscript
options.clearCache.all = 1

permissions.file.storage.1 {
    deleteFile = 1
    deleteFolder = 1
    recursivedeleteFolder = 1
}
```

---

---

## DB Mounts (Sayfa Ağacı Erişimi)

Editörlerin sayfa ağacında **görebileceği ve düzenleyebileceği** sayfaları belirler.
Bu olmadan editörler **tüm siteyi** görür.

### Grup Bazlı DB Mount (Önerilen)

1. **System → Backend User Groups → [Grubu Düzenle]**
2. **Mounts and Workspaces** sekmesi
3. **DB Mounts** alanı → erişilecek root sayfa ID'sini ekle

**Örnek:**
```
DB Mounts: [Haberler (uid: 5)]   ← editör sadece bu dalı görür
```

**Mount and Subpages seçeneği:**
```
✅ Recursive — alt sayfalar dahil erişim
```

### Kullanıcı Bazlı DB Mount

1. **System → Backend Users → [Kullanıcıyı Düzenle]**
2. **Mounts and Workspaces** sekmesi
3. **DB Mounts** → kişiye özel sayfa ekle

> **Not:** Grup mount'ları kullanıcıya otomatik aktarılır. Kullanıcı bazlı mount ek kısıtlama için kullanılır.

---

---

## File Mounts (Dosya Erişimi)

Editörlerin `fileadmin` içinde görebileceği klasörleri sınırlar.

### File Mount Oluşturma

**System → File Storage & Filemounts → File Mounts → +**

| Alan | Değer |
|------|-------|
| **Title** | İçerik Editörü Dosyaları |
| **Base** | fileadmin (Local) |
| **Path** | `user_uploads/content/` |
| **Read Only** | ☐ Hayır |

**Haber Editörü için ayrı mount:**

| Alan | Değer |
|------|-------|
| **Title** | Haber Editörü Dosyaları |
| **Base** | fileadmin (Local) |
| **Path** | `user_uploads/news/` |
| **Read Only** | ☐ Hayır |

### Gruba Atama

1. **System → Backend User Groups → [Grubu Düzenle]**
2. **Mounts and Workspaces** sekmesi
3. **File Mounts** → ilgili mount'u ekle

### Klasörleri Oluştur

```bash
# fileadmin altında klasör yapısı oluştur
ddev exec mkdir -p public/fileadmin/user_uploads/content
ddev exec mkdir -p public/fileadmin/user_uploads/news
ddev exec mkdir -p public/fileadmin/user_uploads/general
```

---

---

## TSconfig ile Kısıtlama

### Page TSconfig (Grupta veya Sayfada)

Grup TSconfig alanına yapıştırılır _veya_ `page.tsconfig` dosyasına eklenir.

```typoscript
# ── İçerik eleman türleri kısıtla ──
TCEFORM.tt_content.CType {
    keepItems = textmedia,text,header,html,list
    # keepItems sadece bunlara izin ver
    # removeItems ise bunları çıkarır (ikisini birlikte kullanma)
}

# ── Sayfa türleri kısıtla ──
TCEFORM.pages.doktype {
    keepItems = 1,4   # 1=Standart, 4=Kısayol
}

# ── Teknik alanları gizle ──
TCEFORM.pages {
    TSconfig.disabled = 1
    tsconfig_includes.disabled = 1
    storage_pid.disabled = 1
}

# ── Backend liste modülü kısıtla ──
mod.web_list {
    hideTables = sys_template,sys_domain,be_users,be_groups,sys_file_storage
}
```

### User TSconfig (Global — Bu Projede Aktif ✓)

`packages/testproject/Configuration/user.tsconfig` — tüm editörlere uygulanır:

```typoscript
# Varsayılan upload klasörü
options.defaultUploadFolder = 1:/user_uploads/

# Cache temizleme yetkisi (sadece sayfa)
options.clearCache.pages = 1
options.clearCache.all = 0

# Clipboard
options.clipboardNumberPads = 3

# Dosya izinleri — silme hakkı yok
permissions.file.default {
    addFile   = 1
    readFile  = 1
    writeFile = 1
    deleteFile = 0    # ← düşük yetkili kullanıcılar silemez
}
```

### Koşullu TSconfig (Sayfa bazlı)

Belirli bir sayfada veya alt ağaçta farklı kısıtlamalar:

```typoscript
# Sadece UID 5 sayfasında (haberler)
[page["uid"] == 5]
    TCEFORM.tt_content.CType {
        keepItems = textmedia,list
    }
    options.defaultUploadFolder = 1:/user_uploads/news/
[end]
```

---

---

## Yeni Kullanıcı Oluşturma

### Backend Adımları

1. **System → Backend Users → +**
2. Doldurulan alanlar:

| Alan | Açıklama | Örnek |
|------|----------|-------|
| **Username** | Giriş adı | `editor.ayse` |
| **Password** | Şifre (güçlü) | `Ay$e2024!Güçlü` |
| **Email** | Bildirim e-postası | `ayse@firma.com` |
| **Real Name** | Görünen ad | Ayşe Kaya |
| **Groups** | Üye olacağı gruplar | İçerik Editörü |
| **DB Mounts** | Erişim sayfaları | [Ana Sayfa (uid:1)] |
| **File Mounts** | Dosya erişimi | İçerik Editörü Dosyaları |
| **Language** | Backend dili | Turkish |

3. Kaydet → kullanıcı hazır

### Kullanıcıyı Test Etme

```bash
# Farklı tarayıcı/gizli sekme ile giriş yap
https://typo3v13.ddev.site/yonetim

# Grup yetkilerinin çalıştığını doğrula:
# ✓ Sadece atanan sayfaları görür
# ✓ Sadece izin verilen CType'ları ekleyebilir
# ✓ sys_template gibi tabloları göremez
# ✓ Administration araçlarına erişemez
```

---

---

## Sayfa İzinleri (Page Permissions)

Her sayfa kendi kullanıcı/grup izinlerine sahiptir. Bir editörün sayfayı düzenleyebilmesi için hem grup erişim listesinde izin hem de sayfada yetki olması gerekir.

### Sayfa İzni Yönetimi

1. **Web → Page** modülünde sayfaya sağ tıkla
2. **Edit page properties** → **Access** sekmesi
3. Veya **Module: Info/Access** üzerinden

### Varsayılan İzin Yapılandırması (Bu Projede Aktif ✓)

`config/system/additional.php` içindeki ayar:

```php
$GLOBALS['TYPO3_CONF_VARS']['BE']['defaultPermissions'] = [
    'user'      => 'show,edit,delete,new,editcontent',
    'group'     => 'show,edit,new,editcontent',
    'everybody' => '',
];
```

Bu ayar yeni oluşturulan tüm sayfalara otomatik uygulanır.

### İzin Seçenekleri

| İzin | Açıklama |
|------|----------|
| `show` | Sayfayı görüntüle |
| `edit` | Sayfa özelliklerini düzenle |
| `delete` | Sayfayı sil |
| `new` | Alt sayfa oluştur |
| `editcontent` | Sayfa içeriklerini düzenle |

---

## Güvenlik En İyi Uygulamaları

| Kural | Uygulama |
|-------|----------|
| **En az yetki** | Sadece işi için gereken izinleri ver |
| **Grup bazlı** | Kullanıcı bazlı değil, grup bazlı yetki tanımla |
| **DB Mount** | Her editöre sadece kendi sayfaları görünsün |
| **File Mount** | `user_uploads/[grup]/` gibi ayrı klasörler |
| **TSconfig** | `keepItems` ile gereksiz seçenekleri kaldır |
| **Şifre politikası** | Güçlü şifre zorunlu tut |
| **Admin kullanım** | Admin hesabıyla günlük iş yapma |

---

## Dosya Yapısı (Bu Proje)

```
packages/testproject/
├── Configuration/
│   ├── user.tsconfig                         ← Global editör TSconfig ✓
│   └── Sets/SitePackage/PageTsConfig/
│       └── UserGroups/
│           ├── content-editor.tsconfig       ← İçerik editörü TSconfig ✓
│           └── news-editor.tsconfig          ← Haber editörü TSconfig ✓
└── ext_localconf.php                         ← user.tsconfig kaydı ✓

config/system/additional.php                  ← defaultPermissions ✓
```

---

## Kaynaklar

- [TYPO3 Backend User Management](https://docs.typo3.org/m/typo3/tutorial-getting-started/main/en-us/Setup/BackendUsers.html)
- [Access Control](https://docs.typo3.org/m/typo3/reference-coreapi/main/en-us/ApiOverview/AccessControl/)
- [User TSconfig Reference](https://docs.typo3.org/m/typo3/reference-tsconfig/main/en-us/UserTsConfig/Index.html)
- [Page TSconfig Reference](https://docs.typo3.org/m/typo3/reference-tsconfig/main/en-us/PageTsConfig/Index.html)
