Why is the authorization context with multiple PSGI applications in Catalyst not working?

StackOverflow https://stackoverflow.com/questions/21427893

  •  04-10-2022
  •  | 
  •  

Pergunta

I have tow cascading Plack middleware applications(app1, app2), app1 is the front application. I followed these tutorials:

This is my code:

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;

Until now everything is ok, I added also the authentication functionality, and for that i used these two catalyst modules: Catalyst::Plugin::Authentication and Catalyst::Plugin::Authorization::Abilities.

The authentication part is working fine for the two applications (user logged from app1), but I got a problem for the authorization part just for app2. When I try to figure out, it was the context variable $c. The app1 $c variable was not the same as app2. After authentication (from app1) I got a user object $c->user, but for the second application I had a new $c created and the $c->user is not found.

So how can these two applications get the same context $c?

Foi útil?

Solução

I find the solution but before that let me explain the situation:

PSGI with muti middelware applications have same limitation. Each middleware behaves as a separate application and each one create its own session. In case, we have the authentication feature(applied for all middelware) we got a prob here. like the example above, the app1 had the session of the authenticated user but app2 had just an anonymous session.

So to fixe it. I create a shared memory to store sessions. For that, me must change Catalyst::Plugin::Session::Store::File with Catalyst::Plugin::Session::Store::FastMmap for app1 and app2.

Then add this config in app2.pm:

 'Plugin::Session' => {
        cookie_name => 'app1_session',
        storage => '/tmp/app1/session_data',
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top