Eu tenho aplicações de middleware Plack em cascata de reboque (app1
, app2
) app1
é o aplicativo da frente. Eu segui estes tutoriais:
- http://advent.plackperl.org/2009/12/day-10-using-plack-middleware.html
- http://advent.plackperl.org/2009/12/day-19-cascade-multiple-applications.html
Este é o meu código:
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;
Até agora está tudo bem, adicionei também a funcionalidade de autenticação, e para isso usei estes dois módulos de catalisadores: Catalyst :: Plugin :: Autenticação e Catalyst :: Plugin :: Autorização :: Habilidades.
A parte de autenticação está funcionando bem para os dois aplicativos (usuário logado app1
), mas eu tenho um problema para a parte de autorização apenas para app2
. Quando tento descobrir, foi a variável de contexto $c
. o app1
$c
variável não era o mesmo que app2
. Após a autenticação (de app1
) Eu tenho um objeto de usuário $c->user
, mas para o segundo aplicativo eu tive um novo $c
criado e o $c->user
Não foi encontrado.
Então, como esses dois aplicativos podem obter o mesmo contexto $c
?
Respostas:
0 para resposta № 1Eu acho a solução mas antes disso, deixe-me explicar a situação:
PSGI com aplicações middelware muti tem o mesmolimitação. Cada middleware se comporta como um aplicativo separado e cada um cria sua própria sessão. No caso, temos o recurso de autenticação (aplicado para todos os middelware) nós temos um prob aqui. como o exemplo acima, o app1
teve a sessão do usuário autenticado, mas app2
tinha apenas uma sessão anônima.
Então, para corrigir isso. Eu crio uma memória compartilhada para armazenar sessões. Para isso, eu preciso mudar Catalyst :: Plugin :: Session :: Loja :: Arquivo com Catalyst :: Plugin :: Session :: Store :: FastMmap para app1
e app2
.
Em seguida, adicione esta configuração em app2.pm
:
"Plugin::Session" => {
cookie_name => "app1_session",
storage => "/tmp/app1/session_data",
}