少しの mod_perl でこれを行うことができます。以下は、セキュリティで保護したい URL のみをキャッチし、他のすべてを無視するように、少し調整する必要があるソリューションの例です。
以下のコードは、Spring Security によって保護されている Grails サーバー上の URL を想定しており、そのページの唯一のものは「ALLOWED」という作業です。URL http://mywebapp.com/some-secured-page.jspを使用しました。
MyModPerlFilter.pm というファイル内の mod_perl コードは次のとおりです。
package MyModPerlFilter;
use strict;
use Apache2::RequestRec;
use Apache2::Connection;
use APR::Table;
use LWP::Simple;
use base qw(Apache2::Filter);
use Apache2::Const -compile => qw(REDIRECT DECLINED M_GET);
use constant BUFF_LEN => 1024;
sub handler : FilterRequestHandler {
my $r = shift;
# check only GET requests for /*.php, ignore everything else
if ($r->uri() =~ m|/.*\.php$| && $r->method_number == Apache2::Const::M_GET) {
# grab Tomcat session ID from request
my $jsessionid = $r->headers_in->{Cookie} =~ /JESSIONID=([^;\s]+)/ && $1;
# fetch secure page with the Tomcat session ID
my $res = get("http://mywebapp.com/some-secured-page.jsp;jsessionid=$jsessionid");
# any response other than the word "ALLOWED" redirect to login form
if ($res ne 'ALLOWED') {
$r->headers_out->set("Location", "http://mywebapp.com/login.jsp");
return Apache2::Const::REDIRECT;
}
}
return Apache2::Const::DECLINED;
}
1;
リクエストが「/*.php」に一致する URL の GET である場合、Grails サーバー上の保護されたページを直接呼び出し、テキスト「ALLOWED」が返されることを確認します。Grails ページへの呼び出しが行われない場合は、ユーザーが認証されていないことを意味し、Spring Security ログイン ページにリダイレクトされます。
唯一のトリッキーな部分は、リクエストからセッション ID を取得し、セキュリティ チェック URL を呼び出すときにそれを含めることです。セッション ID が cookie JSESSIONID に保存され、Tomcat が URL で渡されるセッション ID を許可するように設定されていることを前提としています。
Apache のセットアップでは、mod_perl をインストールして、これと同様に構成する必要があります。
# location of the mod_perl handler (or use the default locations)
PerlSwitches -I/usr/local/somewhere
<VirtualHost *:80>
...
SetHandler modperl
PerlMapToStorageHandler MyModPerlFilter
...
# any proxy related stuff here
ProxyPass / http://127.0.0.1:8080/
ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>