Mojolicious アプリケーション モジュールに次のコードがあります。Test::Mojo $t->post_ok('hosts', encode_json( $json_string ) )->status_is(200) を使用してこれを実行すると、アプリケーションは正常に動作します。Firefox レスト クライアントを使用すると、add_condition ルート修飾子 'access' が渡されません。$can の結果を (add_condition ブロックで) ダンプしたところ、'1' です。したがって、私の考えでは、それはコントローラーに続く必要があります (テストを実行するときと同様)。FF レスト クライアントを使用している場合、アクセス条件が 1 を返した後に何も起こらないため、これは 404 を返します。
これら 2 つの状況でアプリケーションの動作が異なる理由は何ですか?
$self->plugin(
'json_rpc_dispatcher',
services => {
'/auth' => Package::Controller::Auth->new,
'/user' => Package::Controller::User->new,
'/hosts' => Package::Controller::Hosts->new,
}
);
$self->app->routes->add_condition(
access => sub {
my ($rt, $cntrlr, $stuff) = @_;
my $sess = $cntrlr->stash('mojo.session');
my $path = $cntrlr->req->url->path->parts;
my $can = $self->can_access({
route => $path->[0],
args => $sess,
});
$can && return 1;
$cntrlr->render_json({
error => 'Not Authorized',
ok => 0,
});
}
);
$self->hook( before_dispatch => sub {
my $this = shift;
my $params = $this->tx->req->json;
if( !$this->session('auth') ) {
my $login = $self->login({
user => $params->{params}{user},
password => $params->{params}{password},
});
return { error => 'Invalid Username or password' } if $login->{error};
my $access = $self->has_access(
$params->{params}{user}, $params->{params}{password}
);
return { error => 'Invalid credentials' } unless keys %{ $access };
$this->session( auth => { dn => $params->{params}{user}, perms => $access } );
}
else {
$r->find('auth' )->over('access');
$r->find('user' )->over('access');
$r->find('hosts')->over('access');
}
} ); # hook