/ / Dlaczego kontekst autoryzacji z wieloma aplikacjami PSGI w Catalyst nie działa? - perl, moduł perl, katalizator

Dlaczego kontekst autoryzacji z wieloma aplikacjami PSGI w Catalyst nie działa? - perl, perl-moduł, katalizator

Mam aplikacje kaskadowe oprogramowania pośredniczącego Plack (app1, app2), app1 to aplikacja przednia. Poszedłem za tymi samouczkami:

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 № 1

Znajduję 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",
}