1

spring-security プラグインを使用して Tomcat にデプロイされた Grails アプリケーションがあり、その前に Apache Httpd サーバーがあります。一部のファイル操作を実行するいくつかの php スクリプトを httpd サーバーにデプロイしたいと考えています。これは簡単に思えますが、可能であれば、これらのスクリプトへのアクセスを制限して、Grails アプリで認証されたクライアントだけがスクリプトを実行できるようにするにはどうすればよいでしょうか?

スクリプトへのアクセスを制限したいだけですが、一方で、パフォーマンス上の理由からスクリプトを Groovy/Java に移動したくありません [これらのタスクに Tomcat の時間を無駄にしたくありません]。

編集: php スクリプトは [最大 1MB] のファイルになり、クライアントに転送されます。これを読んで、Tomcat から httpd へのリバース プロキシについて考えましたが、Tomcat への影響が心配です。

4

2 に答える 2

2

少しの 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>
于 2012-09-26T20:51:56.587 に答える
0

彼らはセッションを共有する必要があります。共通点がないため、これにはかなりの作業が必要になります。Apache HTTPDがセッションで使用するものと互換性があるように、Javaコードを作成する必要があります。

于 2012-09-21T23:55:21.417 に答える