Oturumlar (Sessions)
HTTP durumsuz bir protokoldür, ancak neredeyse her uygulamanın istekler arasında durumu koruması gerekir, örneğin alışveriş sepetinin içeriği. İşte bu noktada oturumlar devreye girer. Göstereceğimiz konular:
- oturumları nasıl kullanacağınız
- isim çakışmalarını nasıl önleyeceğiniz
- sona erme süresini nasıl ayarlayacağınız
Oturumları kullanırken, her kullanıcıya oturum kimliği adı verilen benzersiz bir tanımlayıcı verilir ve bu tanımlayıcı bir çerezde iletilir. Bu, oturum verileri için bir anahtar görevi görür. Tarayıcı tarafında saklanan çerezlerin aksine, oturum verileri sunucu tarafında saklanır.
Oturumu yapılandırma içinde ayarlarız, özellikle sona erme süresi seçeneği önemlidir.
Oturum yönetimi Nette\Http\Session nesnesi tarafından
gerçekleştirilir. Bu nesneye bağımlılık
enjeksiyonu aracılığıyla erişebilirsiniz. Presenter'larda sadece $session = $this->getSession()
çağırmanız yeterlidir.
Oturumu Başlatma
Nette, varsayılan olarak oturumu okumaya veya veri yazmaya başladığımızda otomatik olarak başlatır. Oturum manuel
olarak $session->start()
ile başlatılır.
PHP, oturum başlatıldığında önbelleğe almayı etkileyen HTTP başlıklarını gönderir, bkz. session_cache_limiter, ve muhtemelen oturum kimliği içeren bir çerez de gönderir. Bu nedenle, herhangi bir çıktıyı tarayıcıya göndermeden önce oturumu her zaman başlatmak gerekir, aksi takdirde bir istisna atılır. Bu nedenle, sayfa oluşturma sırasında oturumun kullanılacağını biliyorsanız, önceden manuel olarak başlatın, örneğin presenter'da.
Geliştirme modunda, Tracy oturumu başlatır çünkü onu Tracy Bar'daki yönlendirme ve AJAX istekleri çubuklarını görüntülemek için kullanır.
Bölümler
Saf PHP'de, oturum veri deposu $_SESSION
genel değişkeni aracılığıyla erişilebilen bir dizi olarak
gerçekleştirilir. Sorun şu ki, uygulamalar genellikle birbirine bağlı olmayan bir dizi parçadan oluşur ve hepsi yalnızca
bir diziye erişebiliyorsa, er ya da geç bir isim çakışması meydana gelir.
Nette Framework, tüm alanı bölümlere ( Nette\Http\SessionSection nesneleri) ayırarak sorunu çözer. Her birim daha sonra benzersiz bir ada sahip kendi bölümünü kullanır ve artık çakışma olamaz.
Bölümü oturumdan alırız:
$section = $session->getSection('benzersiz_isim'); // 'unikatni nazev' translated
Presenter'da sadece parametre ile getSession()
kullanın:
// $this bir Presenter'dır
$section = $this->getSession('benzersiz_isim'); // 'unikatni nazev' translated
Bir bölümün varlığı $session->hasSection('benzersiz_isim')
metoduyla kontrol edilebilir.
Bölümün kendisiyle çalışmak daha sonra set()
, get()
ve remove()
metotlarıyla çok
kolaydır:
// değişken yazma
$section->set('userName', 'franta');
// değişken okuma, yoksa null döndürür
echo $section->get('userName');
// değişkeni kaldırma
$section->remove('userName');
Bölümdeki tüm değişkenleri almak için foreach
döngüsü kullanılabilir:
foreach ($section as $key => $val) {
echo "$key = $val";
}
Sona Erme Süresini Ayarlama
Tek tek bölümler veya hatta tek tek değişkenler için sona erme süresi ayarlamak mümkündür. Böylece kullanıcının oturum açma süresini 20 dakika sonra sona erdirebilir, ancak sepetin içeriğini hatırlamaya devam edebiliriz.
// bölüm 20 dakika sonra sona erecek
$section->setExpiration('20 minutes');
Tek tek değişkenler için sona erme süresini ayarlamak için set()
metodunun üçüncü parametresi
kullanılır:
// 'flash' değişkeni 30 saniye sonra sona erecek
$section->set('flash', $message, '30 seconds');
Tüm oturumun sona erme süresinin (bkz. oturum yapılandırması) tek tek bölümler veya değişkenler için ayarlanan süreye eşit veya daha uzun olması gerektiğini unutmayın.
Daha önce ayarlanan sona erme süresinin iptali removeExpiration()
metoduyla sağlanır. Tüm bölümün anında
iptali remove()
metoduyla sağlanır.
$onStart, $onBeforeWrite Olayları
Nette\Http\Session
nesnesinin olaylar
$onStart
ve $onBeforeWrite
vardır, bu nedenle oturum başlatıldıktan sonra veya diske yazılmadan ve
ardından sonlandırılmadan önce çağrılacak geri aramalar ekleyebilirsiniz.
$session->onBeforeWrite[] = function () {
// oturum verilerini yazacağız
$this->section->set('basket', $this->basket);
};
Oturum Yönetimi
Oturum yönetimi için Nette\Http\Session
sınıfının metotlarına genel bakış:
start(): void
Oturumu başlatır.
isStarted(): bool
Oturum başlatıldı mı?
close(): void
Oturumu sonlandırır. Oturum, betiğin çalışması sonunda otomatik olarak sonlandırılır.
destroy(): void
Oturumu sonlandırır ve siler.
exists(): bool
HTTP isteği oturum kimliği içeren bir çerez içeriyor mu?
regenerateId(): void
Yeni rastgele bir oturum kimliği oluşturur. Veriler korunur.
getId(): string
Oturum kimliğini döndürür.
Yapılandırma
Oturumu yapılandırmada ayarlarız. DI konteyneri kullanmayan bir uygulama yazıyorsanız, yapılandırma için şu metotlar kullanılır. Oturum başlatılmadan önce çağrılmalıdırlar.
setName (string $name): static
Oturum kimliğinin iletildiği çerezin adını ayarlar. Standart ad PHPSESSID
'dir. Aynı web sitesi içinde
birkaç farklı uygulama çalıştırıyorsanız kullanışlıdır.
getName(): string
Oturum kimliğinin iletildiği çerezin adını döndürür.
setOptions (array $options): static
Oturumu yapılandırır. Tüm PHP oturum yönergeleri
(camelCase biçiminde, ör. session.save_path
yerine savePath
yazılır) ve ayrıca readAndClose
ayarlanabilir.
setExpiration (?string $time): static
Oturumun sona ereceği etkinlik dışı kalma süresini ayarlar.
setCookieParameters (string $path, ?string $domain=null, ?bool $secure=null, ?string $samesite=null): static
Çerez parametrelerini ayarlar. Parametrelerin varsayılan değerlerini yapılandırmada değiştirebilirsiniz.
setSavePath (string $path): static
Oturum dosyalarının saklandığı dizini ayarlar.
setHandler (\SessionHandlerInterface $handler): static
Özel bir işleyici ayarlar, bkz. PHP belgeleri.
Önce Güvenlik
Sunucu, istekler aynı oturum kimliğiyle eşlik ettiği sürece sürekli olarak aynı kullanıcıyla iletişim kurduğunu varsayar. Güvenlik mekanizmalarının görevi, bunun gerçekten böyle olmasını ve tanımlayıcının çalınmasının veya sahtesinin yapılmasının mümkün olmamasını sağlamaktır.
Nette Framework bu nedenle PHP yönergelerini, oturum kimliğini yalnızca çerezde iletecek, JavaScript'e erişilemez hale getirecek ve URL'deki olası tanımlayıcıları yok sayacak şekilde doğru bir şekilde yapılandırır. Ayrıca, kullanıcının oturum açması gibi kritik anlarda yeni bir oturum kimliği oluşturur.
PHP yapılandırması için ini_set fonksiyonu kullanılır, ancak maalesef bazı hostingler bunu yasaklar. Bu sizin hostinginiz için de geçerliyse, onlarla fonksiyonu etkinleştirmelerini veya en azından sunucuyu yapılandırmalarını istemeyi deneyin.