Rol Tabanlı Yetkilendirme Paneli
Sıfır bağımlılıklı, OOP mimarili bir yönetim paneli: rol tabanlı yetkilendirme, sunucu taraflı DataTables, CSRF korumalı Ajax, modal CRUD ve açık/koyu tema.
Ekran Görüntüleri 6 görsel
Bu Örnek Ne Yapıyor?
- Rol tabanlı yetkilendirme: hangi rolün neyi yapabildiği tek tabloda, kontrol sunucuda
- Sıfır bağımlılık — Composer, framework ve CDN yok; SQL dosyasını içe aktarın, çalışır
- Katmanlı OOP mimari: yönlendirme, denetleyici, model ve görünüm ayrı
- Sunucu taraflı DataTables ile kullanıcı listesi, arama ve filtreler
- CSRF korumalı Ajax uçları ve modal içinde tam CRUD
- Oturum sertleştirme, kaba kuvvet koruması ve parola hashleme
- Açık/koyu tema ve mobil uyumlu arayüz; kod satır satır Türkçe açıklamalı
Nerede İşe Yarar?
- Küçük ve orta ölçekli projelerde hazır bir yönetim paneli temeli
- Rol ve yetki kavramının gerçek bir uygulama üzerinde öğrenilmesi
- Var olan bir panele rol tabanlı yetkilendirme eklerken referans alınması
- Müşteri paneli, bayi paneli veya iç kullanım araçlarının iskeleti
- Framework kullanmadan katmanlı mimari örneği arayan ekipler
Gereksinimler
- PHP 8.0+ (pdo_mysql, mbstring, gd) · MySQL 5.7+ veya MariaDB 10.3+ · Apache/mod_rewrite
Nasıl Kurulur?
- Proje dosyalarını web köküne kopyalayın (örn. XAMPP'ta htdocs veya kendi web sunucunuzun kök dizini)
- cy_login.sql dosyasını içe aktarın — tabloları, rolleri ve demo hesapları oluşturur
- config klasöründeki veritabanı bilgilerini kendi sunucunuza göre düzenleyin
- upload klasörüne yazma izni verin (profil görselleri buraya kaydedilir)
- Demo hesabıyla giriş yapın ve rollerin hangi menüleri açtığını karşılaştırın
- Canlıya alırken hata gösterimini kapatın ve demo hesapların parolalarını değiştirin
Veritabanı şeması projedeki cy_login.sql dosyasında.
Nasıl Çalışıyor?
CY Admin — PHP PDO · MySQL · AJAX Yönetim Paneli
Sıfır bağımlılıklı, OOP mimarili, rol tabanlı yetkilendirmeye sahip açık kaynak yönetim paneli örneği.Rol tabanlı yetkilendirme · Sunucu taraflı DataTables · CSRF korumalı AJAX
Modal CRUD · Açık/koyu tema · Mobil uyumlu
English · cilginyazilim.com · MIT Lisansı
Ekran Görüntüleri
Tanıtım sayfası — herkese açık, sistemin ne yaptığını anlatır
Kontrol paneli — özet kartlar, kayıt grafiği, role özel bölümler
Kullanıcı yönetimi — sunucu taraflı tablo, arama ve filtreler
Roller ve yetkiler — hangi rol neyi yapabilir, tek tabloda
Giriş ekranı
Koyu tema
Hesabım
Sistem
Mobil görünüm

İçindekiler
- Bu proje nedir?
- Öne çıkan özellikler
- Kurulum
- Demo hesaplar
- Klasör yapısı
- Mimari
- Roller ve yetkiler
- Güvenlik önlemleri
- Yeni sayfa nasıl eklenir?
- Canlıya alma kontrol listesi
- Sık karşılaşılan sorunlar
- Katkı ve lisans
Bu proje nedir?
PHP öğrenirken en çok takılınan yer, "çalışan kod" ile "doğru kod" arasındaki
farktır. Bu depo, klasik bir CRUD örneğini alıp gerçek bir projede olması
gereken hâline getiriyor: katmanlı mimari, rol tabanlı yetkilendirme,
oturum yönetimi ve baştan sona güvenlik.
Composer yok, framework yok, CDN yok. İndirin, cy_login.sql dosyasını içe
aktarın, çalışır. Tüm kod satır satır Türkçe açıklamalıdır; amaç kopyalamak
değil, neden öyle yazıldığını anlamaktır.
Bu depo daha önce tek dosyalık bir CRUD örneğiydi.
Yeni sürümde tam bir yönetim paneline dönüştürüldü.
Eski kurulumdan geçiş içincy_login.sqldosyasının sonundaki
"6) ESKİ SÜRÜMDEN YÜKSELTME" bölümüne bakın.
Öne çıkan özellikler
Mimari
- OOP katmanlı yapı — Core / Models / Repositories / Controllers / Views
- PSR-4 mantığında otomatik yükleyici (Composer'sız)
- Tek giriş noktası (front controller) + rota tablosu
- Repository deseni — SQL tek dosyada, denetleyiciler temiz
- Ara katmanlar (middleware) — yetki kontrolü rota tanımında
Kimlik ve oturum
- Beni hatırla — iki parçalı anahtar (selector + validator), sır veritabanında
- Parola değişince tüm cihazlardaki kalıcı oturumlar iptal edilir
- Kaba kuvvet koruması, oturum sertleştirme, taze yetki kontrolü
Yönetim paneli
- Herkese açık tanıtım sayfası — kök adres, sistemin ne yaptığını anlatır
- Roller ve Yetkiler sayfası — yetki matrisi; her kullanıcı kendi sınırlarını görür
- Role özel kontrol paneli — yönetici/editör istatistik görür, üye kendi hesap özetini
- Temiz adresler —
/login,/users(mod_rewrite kapalıysa tek ayarla eski biçime döner) - Açık/koyu tema hesaba bağlıdır — başka cihazdan girseniz de tercihiniz gelir
- Daraltılabilir sol menü (masaüstünde ikon modu, mobilde çekmece)
- Kontrol paneli: özet kartlar, 14 günlük kayıt grafiği, işlem günlüğü
- Kullanıcı yönetimi: sunucu taraflı DataTables, canlı arama, rol/durum filtresi
- Modal tabanlı ekle / düzenle / detay / sil akışı
- Hesabım sayfası: profil, görsel, parola değiştirme
- Sistem sayfası: güvenlik denetimi, veri durumu ve yürürlükteki kurallar
Mobil
- Off-canvas menü, karartma katmanı, ESC ile kapatma
- 44×44 px dokunma hedefleri
- Modallar alttan açılan panel biçiminde
- Tabloda ikincil sütunlar gizlenir, bilgi ad hücresine taşınır (veri kaybı yok)
- iOS'ta form alanına dokununca otomatik yakınlaştırma engellenir
- Çentikli ekranlar için
safe-areadesteği
Kurulum
Gereksinimler
| En az | Önerilen | |
|---|---|---|
| PHP | 8.1 | 8.2+ |
| MySQL / MariaDB | 5.7 / 10.3 | 8.0+ |
| PHP eklentileri | pdo_mysql, mbstring | + gd (görsel küçültme) |
1. Dosyaları yerleştirin
# XAMPP kullanıyorsanız
cd C:/xampp/htdocs
git clone https://github.com/CilginYazilim/rbac-login-system.git
2. Veritabanını oluşturun
mysql -u root -p < cy_login.sql
veya phpMyAdmin › İçe Aktar › cy_login.sql › Başlat
Dosyacy_loginveritabanını kendisi oluşturur; elle açmanıza gerek yoktur.
Tablolar:users,remember_tokens,login_attempts,activity_log.
3. Ayarları yapın
cp .env.example .env # Windows: copy .env.example .env
.env dosyasını açıp veritabanı bilgilerinizi yazın:
APP_DEBUG=true
APP_PRETTY_URLS=true
DB_HOST=127.0.0.1
DB_NAME=cy_login
DB_USER=root
DB_PASS=.envyoksa uygulama XAMPP varsayılanlarıyla (root / boş parola) çalışır.
APP_PRETTY_URLS=truetemiz adresleri (/login) açar; kökteki.htaccessve
Apache'demod_rewritegerekir. Sunucunuzda yeniden yazma kapalıysafalse
yapın — hiçbir kod değişmez, adreslerindex.php?r=loginbiçimine döner.
4. Klasör izinleri
upload/ klasörü yazılabilir olmalıdır.
chmod 755 upload # Linux / macOS5. Tarayıcıda açın
http://localhost/rbac-login-system/Demo hesaplar
| Rol | E-posta | Parola |
|---|---|---|
| Yönetici | [email protected] | Admin1234 |
| Editör | [email protected] | Editor1234 |
| Üye | [email protected] | Uye12345 |
| Örnek 50 kullanıcı | [email protected] | Demo1234 |
Giriş ekranındaki demo kartlarına tıklayarak formu tek hamlede doldurabilirsiniz.
⚠️ Canlı sunucuda bu hesapları silin veya parolalarını değiştirin.
Giriş ekranındaki demo kartı bloğunu da kaldırın:
views/auth/login.phpiçindeki$demoAccountsdizisi vecy-demobloğu.
Klasör yapısı
├── index.php ← TEK giriş noktası (front controller)
├── .env.example ← Ortam değişkeni şablonu
├── cy_login.sql ← Veritabanı kurulum dosyası
│
├── config/
│ └── config.php ← Tüm ayarlar tek dizide
│
├── routes/
│ └── web.php ← Rota tablosu + yetki kuralları
│
├── app/
│ ├── Core/ ← Çatı sınıfları
│ │ ├── Autoloader.php Sınıf otomatik yükleyici
│ │ ├── Env.php .env okuyucu
│ │ ├── Config.php Nokta notasyonlu ayar erişimi
│ │ ├── Database.php PDO bağlantısı (tembel tekil)
│ │ ├── Session.php Sertleştirilmiş oturum
│ │ ├── Csrf.php Sahte istek koruması
│ │ ├── Auth.php Kimlik doğrulama
│ │ ├── Middleware.php Rota öncesi kontroller
│ │ ├── Router.php İstek yönlendirme
│ │ ├── Request.php Girdi okuma ve temizleme
│ │ ├── Response.php JSON / yönlendirme / güvenlik başlıkları
│ │ ├── Validator.php Form doğrulama
│ │ ├── Uploader.php Güvenli görsel yükleme
│ │ ├── RateLimiter.php Kaba kuvvet koruması
│ │ ├── Flash.php Tek seferlik bildirimler
│ │ └── View.php Şablon motoru
│ │
│ ├── Models/
│ │ ├── User.php ← Kullanıcı varlığı (entity)
│ │ └── Role.php ← Roller ve yetki tablosu
│ │
│ ├── Repositories/
│ │ ├── UserRepository.php ← users tablosunun TEK kapısı
│ │ ├── RememberTokenRepository.php ← "Beni hatırla" anahtarları
│ │ └── ActivityRepository.php ← İşlem günlüğü
│ │
│ ├── Http/
│ │ ├── Controller.php
│ │ └── Controllers/
│ │ ├── HomeController.php ← Herkese açık tanıtım
│ │ ├── AuthController.php
│ │ ├── DashboardController.php
│ │ ├── UserController.php
│ │ ├── RoleController.php ← Roller ve yetkiler
│ │ ├── ProfileController.php
│ │ ├── SettingsController.php
│ │ └── Api/
│ │ ├── UserApiController.php ← AJAX CRUD
│ │ └── PreferenceApiController.php ← Tema tercihi
│ │
│ └── Support/helpers.php ← e(), url(), can(), icon() …
│
├── views/
│ ├── layouts/ ← admin · auth · public · plain
│ ├── partials/ ← sidebar · topbar
│ ├── home/ auth/ dashboard/ users/ roles/ profile/ settings/ errors/
│
├── assets/
│ ├── css/ cilginyazilim.css (tasarım kalıbı) · admin.css (panel)
│ └── js/ app.js (kabuk) · users.js (CRUD) · login.js
│
├── docs/screenshots/ ← README'deki ekran görüntüleri
└── upload/ ← Yüklenen görseller (PHP çalıştırma kapalı)
Mimari
İsteğin yolculuğu
Tarayıcı
│
▼
index.php ────────── Autoloader · .env · Config · Session · Güvenlik başlıkları
│
▼
routes/web.php ───── Rota eşleştirme
│
▼
Middleware ───────── auth · csrf · can:users.delete (başarısızsa DURUR)
│
▼
Controller ───────── Girdiyi al · doğrula · yetkiyi kontrol et
│
▼
Repository ───────── Prepared statement ile veritabanı
│
▼
View / JSON ──────── Ekrana bas veya AJAX yanıtı döndür
Neden bu ayrım?
| Katman | Sorumluluk | İçinde ne olmaz? |
|---|---|---|
| Controller | Akışı yönetir | SQL, HTML |
| Repository | Veritabanı erişimi | Yetki kararı, HTML |
| Model | Veri + davranış | SQL |
| View | Ekrana basma | İş mantığı, sorgu |
Tüm SQL'in tek dosyada olması, güvenlik denetimini de tek dosyaya indirir.
Adres yapısı
Varsayılan temiz adrestir; kökteki.htaccess bununla birlikte gelir:
/login
/users
/api/users/listSunucunuzda
mod_rewrite yoksa .env içinde APP_PRETTY_URLS=false yapın:
index.php?r=users
index.php?r=api/users/listBağlantılar
url() yardımcısıyla ve mutlak üretilir (Router::basePath()),bu yüzden proje bir alt klasörde (
htdocs/rbac-login-system) de, alan adının kökündede aynı şekilde çalışır.
.htaccessiçinde bilerekRewriteBaseyoktur. Alt klasör kurulumunda
RewriteBase /yazmak, isteği yanlışlıklahtdocskökündekiindex.php'ye
gönderir (XAMPP'ta karşılama sayfasına düşersiniz).
Roller ve yetkiler
Yetkilerapp/Models/Role.php içinde tek bir tabloda tanımlıdır.
Kodda rol adı değil yetki adı kullanılır:
Auth::can('users.delete') // ✔ doğru
Auth::user()->role === 'admin' // ✘ kırılgan| Yetki | Yönetici | Editör | Üye |
|---|---|---|---|
| Kontrol panelini görme | ✔ | ✔ | ✔ |
| Özet istatistikler | ✔ | ✔ | — |
| Kullanıcı listesi | ✔ | ✔ | — |
| Kullanıcı ekleme | ✔ | ✔ | — |
| Kullanıcı düzenleme | ✔ | ✔ | — |
| Kullanıcı silme | ✔ | — | — |
| Rol atama | ✔ | — | — |
| Hesap aktif/pasif | ✔ | — | — |
| Kendi profili | ✔ | ✔ | ✔ |
| Sistem sayfası | ✔ | — | — |
Ek iş kuralları
Rol tablosunun üstünde, kazaları ve yetki yükseltmeyi önleyen kurallar vardır:- Yönetici olmayan biri yönetici hesabını düzenleyemez/silemez
- Kimse kendi rolünü değiştiremez, kendini pasifleştiremez, kendini silemez
- Sistemdeki son aktif yönetici silinemez ve pasifleştirilemez
- Yetkisi olmayan biri form üzerinden
rolegönderirse değer sessizce yok sayılır
Yeni rol eklemek için Role::ABILITIES dizisine bir satır eklemek ve
cy_login.sql içindeki ENUM değerini genişletmek yeterlidir.
Güvenlik önlemleri
| Tehdit | Önlem | Dosya |
|---|---|---|
| SQL Injection | Tüm sorgular prepared statement; sıralama sütunu beyaz listeden | UserRepository.php |
| XSS | Her çıktı e() ile kaçışlanır; JS'te .text() kullanılır | helpers.php |
| XSS (2. hat) | Content-Security-Policy; satır içi ` yok | Response.php |
| CSRF | Oturum bazlı anahtar, hash_equals ile sabit süreli karşılaştırma | Csrf.php |
| Kaba kuvvet | 5 hatalı denemede 15 dakika kilit; sayaç veritabanında | RateLimiter.php |
| Kullanıcı sayımı | Tek ve aynı hata mesajı + geçerli bir sahte bcrypt özetiyle oyalama (ölçüldü: her iki yol da ~115 ms) | Auth.php |
| Kalıcı oturum çalınması | "Beni hatırla" anahtarı iki parçalıdır; sır veritabanında SHA-256 özeti olarak durur, anahtar tek kullanımlıktır ve her girişte döner | RememberTokenRepository.php |
| Parola değişiminde artık oturum | Parola değişince kullanıcının tüm cihazlarındaki kalıcı anahtarlar iptal edilir | ProfileController.php |
| Session fixation | Girişte ve periyodik olarak oturum kimliği yenilenir | Session.php |
| Session hijacking | httponly + samesite + secure çerez, tarayıcı parmak izi | Session.php |
| Yetki yükseltme | Rol/durum alanları yetki olmadan okunmaz; güncellemede beyaz liste | UserApiController.php |
| IDOR | Profil güncellemede ID formdan değil oturumdan alınır | ProfileController.php |
| Mass assignment | UserRepository::update() yalnızca izinli sütunları yazar | UserRepository.php |
| Kötü amaçlı dosya | İçerik doğrulaması (getimagesize), uzantıyı sunucu belirler, görsel yeniden üretilir | Uploader.php |
| Path traversal | basename() + realpath() ile klasör dışına çıkış engeli | Uploader.php |
| Parola saklama | password_hash() / bcrypt, girişte otomatik needs_rehash | User.php |
| Bilgi sızıntısı | Canlıda hata detayı gizlenir, X-Powered-By kaldırılır | index.php |
| Clickjacking | X-Frame-Options: DENY, frame-ancestors 'none' | Response.php |
| Kod dosyasına erişim | app/, config/, views/, routes/ için .htaccess engeli | .htaccess` |
Sistem sayfası (yalnızca yönetici) bu önlemlerin kurulumunuzda aktif olup
olmadığını canlı olarak denetler.
Yeni sayfa nasıl eklenir?
Üç adım:
1 — Denetleyiciyi yazın · app/Http/Controllers/ReportController.php
namespace App\Http\Controllers;
use App\Core\Request;
use App\Http\Controller;
final class ReportController extends Controller
{
public function index(Request $request): void
{
$this->view('reports/index', [
'title' => 'Raporlar',
'total' => $this->users()->countAll(),
]);
}
}2 — Rotayı tanımlayın ·
routes/web.php
$router->get('reports', ReportController::class, 'index', ['auth', 'can:reports.view']);3 — Görünümü oluşturun ·
views/reports/index.php
<div class="cy-card">
<div class="cy-card__body">Toplam kullanıcı: <?= (int) $total ?></div>
</div>Menüde görünmesi için
views/partials/sidebar.php içindeki $menu dizisinebir satır, yetkinin tanınması için
app/Models/Role.php içine'reports.view' eklemeniz yeterlidir.Canlıya alma kontrol listesi
- [ ]
.enviçindeAPP_DEBUG=false - [ ] Demo hesapları silin; kendi yönetici hesabınızı oluşturun
- [ ]
views/auth/login.phpiçindeki demo kartı bloğunu kaldırın - [ ] Güçlü bir veritabanı kullanıcısı tanımlayın (root kullanmayın)
- [ ] HTTPS sertifikası kurun (oturum çerezi otomatik
secureolur) - [ ]
.env,app/,config/,views/,routes/tarayıcıdan erişilemez olsun - [ ]
upload/klasöründe PHP çalıştırma kapalı olsun - [ ] PHP hata günlüğünü (
error_log) bir dosyaya yönlendirin - [ ] Veritabanı yedeklemesini planlayın
- [ ] Sistem sayfasındaki denetim listesini kontrol edin — hepsi yeşil olmalı
Nginx kullanıyorsanız
.htaccess dosyaları yok sayılır. Sunucu bloğunuza ekleyin:
location ~ ^/(app|config|views|routes)/ { deny all; return 404; }
location ~ /\. { deny all; return 404; }
location ~ \.(sql|md|log|ini|bak)$ { deny all; return 404; }
location ^~ /upload/ { location ~ \.php$ { deny all; } }Sık karşılaşılan sorunlar
"Veritabanına bağlanılamadı" hatası
.env dosyanızdaki DB_USER / DB_PASS değerlerini kontrol edin.
XAMPP varsayılanı root ve boş paroladır. MySQL servisinin çalıştığından
emin olun.
Giriş yapıyorum ama sürekli giriş ekranına dönüyorum
Oturum klasörü yazılabilir değildir. php.ini içindeki session.save_path
değerini kontrol edin. Ayrıca tarayıcı çerezlerinin açık olduğundan emin olun.
"Çok fazla hatalı deneme" — kendimi kilitledim
DELETE FROM login_attempts;Süre dolduğunda (varsayılan 15 dakika) kilit kendiliğinden kalkar.
Görsel yükleniyor ama görünmüyor
upload/ klasörünün yazma izni olmalıdır (755). Ayrıca php.ini içindeki
upload_max_filesize ve post_max_size değerleri en az 2 MB olmalıdır.
Türkçe karakterler bozuk görünüyor
Veritabanı ve tablolar utf8mb4_unicode_ci olmalıdır. cy_login.sql bunu
zaten ayarlar; eski bir tabloyu dönüştürmek için:
ALTER TABLE users CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Sayfa stilsiz görünüyor / JS çalışmıyor
Tarayıcı konsolunu açın. Content-Security-Policy hatası görüyorsanız
kendi eklediğiniz satır içi bir `` veya dış CDN bağlantısı olabilir.
Tüm JavaScript ayrı dosyada olmalıdır. Geçici olarak config/config.php
içinden security.csp_enabled değerini false yapabilirsiniz.
Görseller küçültülmüyor
PHP'nin gd eklentisi kurulu değildir. Zorunlu değildir; eklenti yoksa
görsel olduğu gibi kaydedilir, diğer güvenlik kontrolleri yine çalışır.
XAMPP'ta php.ini içinde extension=gd satırını açın.
Katkı ve lisans
Katkılara açığız. Depoyu çatallayın (fork), bir dal açın, değişikliğinizi
gönderin. Kod yazarken mevcut üslubu koruyun: **Türkçe açıklamalar,
declare(strict_types=1), katman ayrımına saygı.**
MIT Lisansı — dilediğiniz gibi indirip kullanabilir, değiştirebilir,
ticari projelerinizde kullanabilirsiniz.
cilginyazilim.com ile geliştirildi
Faydalı bulduysanız ⭐ vermeyi unutmayın.
Kaynak Kod soldaki ağaçtan bir dosya seçin
-
app
-
Core
- Auth.php 14.1 KB
- Autoloader.php 2.2 KB
- Config.php 1.9 KB
- Csrf.php 2.8 KB
- Database.php 3.5 KB
- Env.php 3 KB
- Flash.php 2.6 KB
- Middleware.php 3.9 KB
- RateLimiter.php 3.9 KB
- Request.php 4.5 KB
- Response.php 7 KB
- Router.php 6.3 KB
- Session.php 6.3 KB
- Uploader.php 10.1 KB
- Validator.php 8.8 KB
- View.php 3.5 KB
-
Http
-
Controllers
-
Api
- PreferenceApiController.php 2.5 KB
- UserApiController.php 18.9 KB
- AuthController.php 3.2 KB
- DashboardController.php 7.4 KB
- HomeController.php 10.4 KB
- ProfileController.php 7 KB
- RoleController.php 1.7 KB
- SettingsController.php 9.4 KB
- UserController.php 1.1 KB
-
- Controller.php 1.3 KB
-
-
Models
- Role.php 9.1 KB
- User.php 7.7 KB
-
Repositories
- ActivityRepository.php 3.6 KB
- RememberTokenRepository.php 5.8 KB
- UserRepository.php 17.1 KB
-
Support
- helpers.php 12.5 KB
- .htaccess 851 B
-
-
assets
-
css
- admin.css 46.4 KB
- bootstrap.min.css 227.5 KB
- cilginyazilim.css 29.8 KB
- dataTables.bootstrap5.min.css 11.7 KB
-
images
- logo.png 70.4 KB
-
js
- app.js 14.8 KB
- bootstrap.bundle.js 203.2 KB
- dataTables.bootstrap5.min.js 2.3 KB
- jquery-3.7.0.js 278.3 KB
- jquery.dataTables.min.js 85.1 KB
- login.js 1.8 KB
- users.js 20.3 KB
-
-
config
- .htaccess 196 B
- config.php 5.2 KB
-
docs
-
screenshots
- 01-tanitim.png 352.6 KB
- 02-giris.png 766.9 KB
- 03-kontrol-paneli.png 226.7 KB
- 04-kullanicilar.png 256.4 KB
- 05-roller.png 189.7 KB
- 06-hesabim.png 172.2 KB
- 07-sistem.png 243.4 KB
- 08-koyu-tema.png 232.4 KB
- 09-mobil.png 149.1 KB
- README.md 1.8 KB
- klasor-adini-degistir.md 2.8 KB
-
-
routes
- .htaccess 197 B
- web.php 5.4 KB
-
upload
- .htaccess 357 B
- 1130289535.png 3.1 KB
- 1131702286.png 4.1 KB
- 1832783644.png 70.4 KB
- 2090273627.png 3.6 KB
- c3ace7893e5fc8e86aec3507996cefb2.png 70.9 KB
- f2c1d0c3d6e0276f176d80f22d9870d9.png 70.9 KB
-
views
-
auth
- login.php 7.6 KB
-
dashboard
- index.php 15.8 KB
-
errors
- 403.php 582 B
- 404.php 844 B
- 500.php 565 B
-
home
- index.php 6.3 KB
-
layouts
- admin.php 5.3 KB
- auth.php 2 KB
- plain.php 1.2 KB
- public.php 3.5 KB
-
partials
- sidebar.php 4.3 KB
- topbar.php 4.4 KB
-
profile
- index.php 13.8 KB
-
roles
- index.php 5.7 KB
-
settings
- index.php 6.8 KB
-
users
- index.php 6.1 KB
- modals.php 13.8 KB
- .htaccess 262 B
-
- .gitignore 1.2 KB
- .htaccess 5.1 KB
- cy_login.sql 21.1 KB
- index.php 5.4 KB
- LICENSE 1.1 KB
- README.en.md 11.4 KB
- README.md 20.2 KB
Güvenlik gereği kaynak dosyalardaki parola, API anahtarı ve benzeri gizli
değerler gösterilmeden önce maskelenir (••••••••).
Sık Sorulan Sorular
Yetkinin kullanıcıya değil role bağlandığı modeldir: kullanıcı bir role atanır, rol bir yetki kümesine sahiptir. Yeni bir kullanıcı eklendiğinde tek tek yetki vermek yerine rol seçilir; bir yetki değiştiğinde o roldeki herkes için aynı anda değişir. Bu panelde roller ve yetkiler tek bir tabloda tutulur ve hangi rolün neyi yapabildiği tek ekrandan görülür.
Hayır. Arayüzde bir bağlantıyı gizlemek yalnızca görsel bir kolaylıktır; adresi bilen biri doğrudan istek gönderebilir. Bu yüzden yetki kontrolü her istekte sunucu tarafında yapılır ve yetkisiz istek arayüzden bağımsız olarak reddedilir. Menü gizleme, o kontrolün yerine değil üstüne konur.
Hayır. Proje sıfır bağımlılıkla çalışır: Composer, framework ve CDN kullanılmaz, tüm kütüphaneler proje içindedir. İndirip cy_login.sql dosyasını içe aktarmanız ve veritabanı bilgilerini yazmanız yeterlidir. Paylaşımlı hostinglerde de ek kurulum gerektirmez.
Parolalar hiçbir zaman düz metin olarak tutulmaz; PHP'nin password_hash fonksiyonuyla hashlenir ve doğrulama password_verify ile yapılır. Ayrıca ard arda başarısız giriş denemelerine karşı kaba kuvvet koruması ve sertleştirilmiş oturum ayarları vardır.
README'deki "Yeni sayfa nasıl eklenir?" bölümü adım adım anlatır: rota tanımlanır, denetleyici metodu yazılır, görünüm dosyası eklenir ve sayfanın gerektirdiği yetki rol tablosuna işlenir. Yetki tanımlanmadığı sürece sayfa hiçbir rolde görünmez — varsayılan davranış reddetmektir.
Yorumlar 0 konuşma
Bu kod örneğine henüz yorum yapılmamış. Takıldığınız bir yer veya merak ettiğiniz bir ayrıntı varsa ilk soruyu siz sorun.
Soru Sor veya Yorum Yaz
Yorumunuz onaylandıktan sonra yayınlanır. Teknik sorularınıza ekibimiz yanıt verir.