Oturumlar
HTTP durumsuz bir protokoldür, ancak neredeyse her uygulamanın istekler arasında durum tutması gerekir, örneğin bir alışveriş sepetinin içeriği. Oturum bunun için kullanılır. Bakalım
- oturumlar nasil kullanilir
- adlandirma çatişmalarindan nasil kaçinilir
- son kullanma tari̇hi̇ nasil ayarlanir
Oturumları kullanırken, her kullanıcı oturum kimliği adı verilen ve bir çerezde aktarılan benzersiz bir tanımlayıcı alır. Bu, oturum verilerinin anahtarı olarak işlev görür. Tarayıcı tarafında saklanan çerezlerin aksine, oturum verileri sunucu tarafında saklanır.
Yapılandırmada oturumu yapılandırırız, sona erme süresinin seçimi önemlidir.
Oturum, bağımlılık enjeksiyonu kullanarak
aktardığınız Nette\Http\Session nesnesi tarafından
yönetilir. Sunucularda $session = $this->getSession()
adresini çağırmanız yeterlidir.
Başlangıç Oturumu
Varsayılan olarak, Nette bir oturumdan okumaya veya ona veri yazmaya başladığımız anda otomatik olarak bir oturum
başlatacaktır. Bir oturumu manuel olarak başlatmak için $session->start()
adresini kullanın.
PHP, oturumu başlatırken önbelleğe almayı etkileyen HTTP başlıkları gönderir, bkz. session_cache_limiter, ve muhtemelen oturum kimliğini içeren bir çerez. Bu nedenle, tarayıcıya herhangi bir çıktı göndermeden önce oturumu başlatmak her zaman gereklidir, aksi takdirde bir istisna fırlatılır. Bu nedenle, sayfa oluşturma sırasında bir oturumun kullanılacağını biliyorsanız, oturumu daha önce manuel olarak, örneğin sunucuda başlatın.
Geliştirici modunda, Tracy oturumu başlatır çünkü Tracy Bar'da yeniden yönlendirme ve AJAX istekleri çubuklarını görüntülemek için kullanır.
Bölüm
Saf PHP'de oturum veri deposu, $_SESSION
global değişkeni aracılığıyla erişilebilen bir dizi olarak
uygulanır. Sorun şu ki, uygulamalar normalde bir dizi bağımsız parçadan oluşur ve hepsinde yalnızca aynı dizi mevcutsa,
er ya da geç bir isim çakışması meydana gelecektir.
Nette Framework bu sorunu tüm alanı bölümlere ayırarak çözer (nesneler Nette\Http\SessionSection). Her birim daha sonra benzersiz bir adla kendi bölümünü kullanır ve hiçbir çarpışma meydana gelmez.
Bölümü oturum yöneticisinden alıyoruz:
$section = $session->getSection('unique name');
Sunucuda getSession()
adresini parametre ile çağırmak yeterlidir:
// $this Sunucu
$section = $this->getSession('unique name');
Kesitin varlığı $session->hasSection('unique name')
yöntemi ile kontrol edilebilir.
Bölümün kendisiyle set()
, get()
ve remove()
yöntemlerini kullanarak çalışmak çok
kolaydır:
// değişken yazımı
$section->set('userName', 'franta');
// bir değişkeni okuma, mevcut değilse null döndürür
echo $section->get('userName');
// değişken kaldırma
$section->remove('userName');
Tüm değişkenleri bölümden elde etmek için foreach
döngüsünü kullanmak mümkündür:
foreach ($section as $key => $val) {
echo "$key = $val";
}
Son Kullanma Tarihi Nasıl Ayarlanır
Süre sonu, tek tek bölümler ve hatta tek tek değişkenler için ayarlanabilir. Kullanıcının oturum açma süresinin 20 dakika içinde sona ermesine izin verebiliriz, ancak yine de bir alışveriş sepetinin içeriğini hatırlayabiliriz.
// bölüm 20 dakika sonra sona erecektir
$section->setExpiration('20 minutes');
set()
yönteminin üçüncü parametresi, bireysel değişkenlerin sona erme süresini ayarlamak için
kullanılır:
// 'flash' değişkeninin süresi 30 saniye sonra dolar
$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 yüksek olması gerektiğini unutmayın.
Daha önce ayarlanmış olan sürenin iptali removeExpiration()
yöntemi ile gerçekleştirilebilir. Tüm
bölümün derhal silinmesi remove()
yöntemi ile sağlanacaktır.
Olaylar $onStart, $onBeforeWrite
Object Nette\Http\Session
$onStart
a $onBeforeWrite
olaylarına sahiptir, böylece oturum başladıktan sonra veya diske
yazılıp sonlandırılmadan önce çağrılan geri aramalar ekleyebilirsiniz.
$session->onBeforeWrite[] = function () {
// oturuma veri yazma
$this->section->set('basket', $this->basket);
};
Oturum Yönetimi
Oturum yönetimi için Nette\Http\Session
sınıfının yöntemlerine genel bakış:
start(): void
Bir oturum başlatır.
isStarted(): bool
Oturum başladı mı?
close(): void
Oturumu sonlandırır. Oturum, komut dosyasının sonunda otomatik olarak sona erer.
destroy(): void
Oturumu sonlandırır ve siler.
exists(): bool
HTTP isteği oturum kimliğine sahip bir çerez içeriyor mu?
regenerateId(): void
Yeni bir rastgele oturum kimliği oluşturur. Veriler değişmeden kalır.
getId(): string
Oturum kimliğini döndürür.
Konfigürasyon
Oturumu yapılandırmada yapılandırıyoruz. DI konteyneri kullanmayan bir uygulama yazıyorsanız, yapılandırmak için bu yöntemleri kullanın. Oturum başlatılmadan önce çağrılmalıdırlar.
setName (string $name): static
Oturum kimliğini iletmek için kullanılan çerezin adını ayarlar. Varsayılan adPHPSESSID
şeklingetName(): string
Oturum çerezinin adını döndürür.
setOptions (array $options): static
Oturumu yapılandırır. Tüm PHP oturum yönergelerini ayarlamak (camelCase biçiminde, örneğinsession.save_path
yerine savePath
yazmak) ve ayrıca readAndClose yapmsetExpiration (?string $time): static
Oturumun sona ereceği hareketsizlik süresini ayarlar.
setCookieParameters (string $path, ?string $domain=null, ?bool $secure=null, ?string $samesite=null): static
Çerezler için parametreleri ayarlar. Varsayılan parametre değerlerini configuration#Session cookie bölümünden değiştirebilirsiniz.
setSavePath (string $path): static
Oturum dosyalarının depolandığı dizini ayarlar.
setHandler (\SessionHandlerInterface $handler): static
Özel işleyici ayarlar, PHP belgelerine bakınız.
Önce Güvenlik
Sunucu, istekler aynı oturum kimliğini içerdiği sürece aynı kullanıcıyla iletişim kurduğunu varsayar. Güvenlik mekanizmalarının görevi, bu davranışın gerçekten çalıştığından ve bir tanımlayıcıyı değiştirme veya çalma olasılığının olmadığından emin olmaktır.
Bu nedenle Nette Framework, oturum kimliğini yalnızca çerezlerde aktarmak, JavaScript'ten erişimi önlemek ve URL'deki tanımlayıcıları yok saymak için PHP yönergelerini uygun şekilde yapılandırır. Dahası, kullanıcı girişi gibi kritik anlarda yeni bir Oturum Kimliği oluşturur.
PHP'yi yapılandırmak için ini_set işlevi kullanılır, ancak ne yazık ki bazı web barındırma hizmetlerinde kullanımı yasaktır. Eğer sizin durumunuz buysa, barındırma sağlayıcınızdan bu işleve izin vermesini ya da en azından sunucusunu düzgün bir şekilde yapılandırmasını isteyin.