2015-03-21 15 views
7

Şimdi benim app.psgi (basitleştirilmiş) içerir:Plack :: Middleware :: Session tarafından yönetilen bir çerez için son kullanma süresi nasıl ayarlanır?

builder { 
     enable 'Session', store => 'File'; #default uses Plack::Session::State::Cookie 
     $app; 
}; 

Daha sonra $app içinde kullanıyorum:

  • :

    my $req = Plack::Request->new($env); 
    my $session = $req->session(); #returns env->{'psgix.session'} 
    $session->{user} = "name"; 
    

    O Tamam, mesela işleri kullanıcı oturum açtığında, adını sunucu tarafında saklanan oturum dosyasında saklıyorum ve Plack::Middleware::Session imple session-state-cookie,

  • ve kullanıcı tarayıcıyı kapattığında, çerez otomatik olarak silinir (varsayılan olarak Plack::Session::State::Cookie, çerez için herhangi bir son kullanma tarihi ayarlamamıştır).

Şimdi, giriş panelimde "Beni hatırla" özelliğini uygulamak istiyorum. Bu durumda, sesion-state-cookie otomatik olarak tarayıcıdan kaldırılmamalıdır. Bu, Plack::Session::State::Cookie'dan expires yöntemini kullanarak yapılabilir.

soru: Benim $app den (Session katman tarafından yönetilen) çerez sona erme nasıl değişebileceği

. Başka bir deyişle, nasıl biraz burada yöntemini sona çağırmak için:

my $req = Plack::Request->new($env); 
my $session = $req->session(); #returns env->{'psgix.session'} 
$session->{user} = "name"; 
my $cookie_state = WHAT_TO_DO_HERE_TO_GET; #the current Plack::Session::State::Cookie object 
$cookie_state->expire(86400*14); #expire in two weeks 

birisi burada, gereken bir çalışma örneği ise.

use strict; 
use warnings; 
use Plack::Request; 
use Plack::Response; 
use Plack::Builder; 
use Data::Dumper; 

my $app = sub { 
    my $env = shift; 
    my $req = Plack::Request->new($env); 
    my $session = $req->session; 
    my $res = Plack::Response->new(200); 
    $res->content_type('text/html'); 
    my $link = $session->{user} 
      ? q{ <a href="/logout">logout</a>} 
      : q{ <a href="/login">login</a>} 
      ; 
    $res->body(["Session user:", $session->{user}, "<br>$link"]); 
    return $res->finalize; 
}; 

my $login = sub { 
    my $env = shift; 
    my $req = Plack::Request->new($env); 
    my $session = $req->session; 

    $session->{user} = "some"; 
    #how to set here the session-state-cookie expiration? 

    my $res = Plack::Response->new(); 
    $res->redirect("/", 302); 
    return $res->finalize; 
}; 

my $logout = sub { 
    my $env = shift; 
    my $req = Plack::Request->new($env); 
    my $session = $req->session; 
    delete $session->{user}; 
    my $res = Plack::Response->new(); 
    $res->redirect("/", 302); 
    return $res->finalize; 
}; 

builder { 
    enable 'Session', store => 'File'; 
    mount "/login" => $login; 
    mount "/logout" => $logout; 
    mount "/favicon.ico" => sub { return [ 404, ['Content-Type' => 'text/html'], [ '404 Not Found' ] ] }; 
    mount "/" => $app; 
}; 

cevap

5

doğrudan son kullanım tarihini değiştiremez, ancak bu gibi yeni bir son kullanma tarihi ile yeni bir oturum oluşturmak için oturum ortakatmanını zorlayabilirsiniz: Bir kullanıcı günlükleri ise

$env->{'psgix.session.options'}{change_id} = 1; 
$env->{'psgix.session.options'}{expires} = $my_expires; 

, Kimliği zaten prevent session fixation attacks olarak değiştirmelisiniz. Desteklenen son kullanma tarihi biçimleri için bkz. Cookie::Baker.

DÜZENLEME: Eğer küresel varsayılan son zaman aşımı ayarlamak istiyorsanız, el durum nesnesi oluşturabilir ve kurucusuna expires parametre geçirmek: Bazı yöntem çağrıları beklenen rağmen,

builder { 
    enable 'Session', 
     state => Plack::Session::State->new(
      expires => $timeout_in_seconds, 
     ); 
    $app; 
}; 
+1

bunu * *Eserleri**. Sorum şu, bu nerede belgelendi? Çünkü "psgix.session.options" için Plack :: Middleware :: Session [bazı alt anahtarlar belgelenmiştir] (https://metacpan.org/pod/Plack::Middleware::Session#PLACK-REQUEST-OPTIONS) ama 'expires' eksik. (Burada sadece "son kullanma"/çoğul (lar) olmadan/oturumu geçersiz kılan şey). Gerçekten bunu nereden biliyorsun merak ediyorsun. Modül kaynaklarında kazarak? Neyse ** çok teşekkür ederim. – kobame

+2

@kobame Evet, bunu kaynak koduna bakarak biliyorum. Eksik belgelerle ilgili bir [GitHub sorunu] (https://github.com/plack/Plack-Middleware-Session/issues/33) açtım. – nwellnhof

+0

Cevabınız için teşekkür etmek istedim; Bunu uygulamamda bir deneyin. Github sorununun herhangi bir faaliyeti olmamıştır ve kullandığım çerçeve (Kelp) bunun etrafında herhangi bir seçeneğe sahip değildir. – saberworks

İlgili konular