我有级联Plack中间件应用程序(app1
,app2
),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::Authentication和Catalyst::Plugin::Authorization::Abilities。
身份验证部分适用于两个应用程序(用户从app1
登录),但我的app2
授权部分出现问题。当我试图找出时,它是上下文变量$c
。 app1
$c
变量与app2
不同。身份验证后(来自app1
)我收到了一个用户对象$c->user
,但是对于第二个应用程序,我创建了一个新的$c
,但未找到$c->user
。
那么这两个应用程序如何获得相同的上下文$c
?
答案 0 :(得分:0)
我找到了解决方案,但在此之前让我解释一下情况:
具有多个middelware应用程序的PSGI具有相同的限制。每个中间件都表现为一个单独的应用程序,每个中间件都创建自己的会话。如果我们有身份验证功能(适用于所有middelware)我们在这里遇到了问题。与上面的示例一样,app1
拥有经过身份验证的用户的会话,但app2
只有一个匿名会话。
所以要解决它。我创建了一个共享内存来存储会话。为此,我必须使用app1
app2
和app2.pm
更改Catalyst::Plugin::Session::Store::File。
然后在 'Plugin::Session' => {
cookie_name => 'app1_session',
storage => '/tmp/app1/session_data',
}
中添加此配置:
{{1}}