Mam aplikacje kaskadowe oprogramowania pośredniczącego Plack (app1
, app2
), app1
to aplikacja przednia. Poszedłem za tymi samouczkami:
- http://advent.plackperl.org/2009/12/day-10-using-plack-middleware.html
- http://advent.plackperl.org/2009/12/day-19-cascade-multiple-applications.html
To jest mój kod:
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;
Do tej pory wszystko było w porządku, dodałem także funkcję uwierzytelniania i do tego użyłem tych dwóch modułów katalizatora: Catalyst :: Plugin :: Authentication i Catalyst :: Plugin :: Authorization :: Umiejętności.
Część uwierzytelniająca działa poprawnie dla dwóch aplikacji (użytkownik zalogowany) app1
), ale mam problem z częścią autoryzacji tylko dla app2
. Kiedy próbuję się domyślić, była to zmienna kontekstowa $c
. The app1
$c
zmienna nie była taka sama jak app2
. Po uwierzytelnieniu (od app1
) Mam obiekt użytkownika $c->user
, ale dla drugiej aplikacji miałem nowy $c
stworzony i $c->user
nie znaleziono.
Jak więc te dwie aplikacje mogą uzyskać ten sam kontekst $c
?
Odpowiedzi:
0 dla odpowiedzi № 1Znajduję rozwiązanie, ale wcześniej pozwól mi wyjaśnić sytuację:
PSGI z muti middelware ma takie same aplikacjeograniczenie. Każde oprogramowanie pośrednie zachowuje się jak osobna aplikacja i każda z nich tworzy własną sesję. W przypadku, gdy mamy funkcję uwierzytelniania (zastosowaną dla wszystkich programów pośrednich), mamy tutaj problem. jak w powyższym przykładzie app1
miał sesję uwierzytelnionego użytkownika, ale app2
miała tylko anonimową sesję.
Aby to naprawić. Tworzę pamięć współdzieloną do przechowywania sesji. W tym celu muszę się zmienić Catalyst :: Plugin :: Session :: Store :: File z Catalyst :: Plugin :: Session :: Store :: FastMmap dla app1
i app2
.
Następnie dodaj tę konfigurację app2.pm
:
"Plugin::Session" => {
cookie_name => "app1_session",
storage => "/tmp/app1/session_data",
}