为什么Catalyst中的多个PSGI应用程序的授权上下文不起作用?

时间:2014-01-29 10:12:49

标签: perl perl-module catalyst

我有级联Plack中间件应用程序(app1app2),app1是前端应用程序。我按照这些教程:

这是我的代码:

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;

到目前为止一切正常,我还添加了身份验证功能,为此我使用了这两个催化剂模块:Catalyst::Plugin::AuthenticationCatalyst::Plugin::Authorization::Abilities

身份验证部分适用于两个应用程序(用户从app1登录),但我的app2授权部分出现问题。当我试图找出时,它是上下文变量$capp1 $c变量与app2不同。身份验证后(来自app1)我收到了一个用户对象$c->user,但是对于第二个应用程序,我创建了一个新的$c,但未找到$c->user

那么这两个应用程序如何获得相同的上下文$c

1 个答案:

答案 0 :(得分:0)

我找到了解决方案,但在此之前让我解释一下情况:

具有多个middelware应用程序的PSGI具有相同的限制。每个中间件都表现为一个单独的应用程序,每个中间件都创建自己的会话。如果我们有身份验证功能(适用于所有middelware)我们在这里遇到了问题。与上面的示例一样,app1拥有经过身份验证的用户的会话,但app2只有一个匿名会话。

所以要解决它。我创建了一个共享内存来存储会话。为此,我必须使用app1 app2app2.pm更改Catalyst::Plugin::Session::Store::File

然后在 'Plugin::Session' => { cookie_name => 'app1_session', storage => '/tmp/app1/session_data', } 中添加此配置:

{{1}}