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.

Kurulum ve gereksinimler

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.

versiyon: 4.0