Mám kaskádové kaskádové aplikácie middleware aplikácie Plack (app1
, app2
) app1
je predná aplikácia. Nasledoval som tieto návody:
- http://advent.plackperl.org/2009/12/day-10-using-plack-middleware.html
- http://advent.plackperl.org/2009/12/day-19-cascade-multiple-applications.html
Toto je môj kód:
use Plack::App::Cascade;
use Plack::App::URLMap;
use lib "/var/www/app1/lib",
"/var/www/app2/lib";
use app1;
use app2;
my $app1 = app1->psgi_app(@_);
my $app2 = app2->psgi_app(@_);
my $app_map1 = Plack::App::URLMap->new;
$app_map2->mount( "/" => $app1 );
my $app2 = Plack::App::URLMap->new;
$app2->mount( "/app2" => $app2 );
Plack::App::Cascade->new(apps => [ $app_map1, $app_map2 ])->to_app;
Až doteraz bolo všetko v poriadku, pridala som aj autentifikačnú funkciu a za to som použil tieto dva katalyzátorové moduly: Katalyzátor :: Plugin :: Authentication a Katalyzátor :: Plugin :: autorizáciu :: Schopnosti.
Časť autentifikácie funguje správne pre dve aplikácie (používateľ prihlásený z app1
), ale mám problém pre autorizáciu len pre app2
, Keď sa snažím zistiť, bola to kontextová premenná $c
, app1
$c
premenná nebola rovnaká ako app2
, Po overení (od app1
) Mám objekt používateľa $c->user
, ale pre druhú žiadosť som mal nový $c
vytvorené a $c->user
sa nenašla.
Takže ako môžu tieto dve aplikácie získať rovnaký kontext $c
?
odpovede:
0 pre odpoveď č. 1Nájdem riešenie, ale predtým mi dovoľte vysvetliť situáciu:
PSGI s aplikáciami muti middelware majú rovnakéobmedzenia. Každý middleware sa správa ako samostatná aplikácia a každý vytvorí vlastnú reláciu. V prípade, že máme funkciu autentifikácie (pre všetky middelware), máme tu problém. ako príklad uvedený vyššie, app1
mal reláciu overeného používateľa, ale app2
mal len anonymné stretnutie.
Takže, aby to bolo možné. Vytváram zdieľanú pamäť na uloženie relácií. Preto sa musím zmeniť Katalyzátor :: Plugin :: Session :: obchod :: File s Katalyzátor :: Plugin :: Session :: obchod :: FastMmap pre app1
a app2
.
Potom pridajte túto konfiguráciu app2.pm
:
"Plugin::Session" => {
cookie_name => "app1_session",
storage => "/tmp/app1/session_data",
}