2017-08-10 9 views
0

はじめに: 当社は動的に生成されたvhostをmod_perl経由で使用し、データベースから仮想ホストを生成します。基本的には、数百の顧客やパートナーに対して動的に変更されるテーブル「ドメイン」があります。mod_perl + mod_authn_dbdはAuthDBDUserPWQueryを受け入れません

私たちは、別名、インクルードとルールを持ついくつかの種類のテンプレートを持っています。私たちがPerlのループで使用される変数で、ホスト名を定義したテンプレートで

<Perl> 
    #!perl 

    use DBI; 
    use Time::HiRes qw(time); 

    use Apache2::ServerUtil(); 
    my $s = Apache2::ServerUtil->server; 

    $Apache2::PerlSections::Save = 1; 

    my $dsn = "dbi:mysql:...:..."; 
    my $user = "..."; 
    my $pw = "..."; 
    my $db = DBI->connect($dsn, $user, $pw) or die $DBI::errstr; 

    my $select = qq/SELECT * FROM domains ORDER BY ID/; 
    my $sth_select = $db->prepare($select); 

    $sth_select->execute() or die $DBI::errstr; 
    my @row; 
    while(@row = $sth_select->fetchrow_array) { 
     $My::domain = @row[1]; 
     $My::dir = @row[3]; 
     $My::template = @row[4]; 
     $s->add_config(["Include /srv/www/vhosts/templates/".$My::template]); 
    } 
</Perl> 

:だから私たちは基本的に異なるテンプレートを生成するには、次のPerlスクリプトを使用します。

プレビュー目的で、データベースで制御されたログインでプロジェクト/ドメインの一部を保護したいと考えています。それがmod_atuhn_dbdがゲームに入る場所です。

apache2[10988]: $parms->add_config() has failed: 
AuthDBDUserPWQuery takes one argument, Query used to fetch password for user at /usr/lib/x86_64-linux-gnu/perl5/5.20/Apache2/PerlSections.pm line 216.\n 

私は削除する場合: - Apacheは述べてい

<VirtualHost *:80> 
    DBDriver mysql 
    DBDParams "host=... dbname=... port=3306 user=... pass=..." 
    DBDMin  1 
    DBDKeep 2 
    DBDMax  10 
    DBDExptime 60 

    <Perl> 
     use File::Copy; 
     $ServerName = $My::domain; 
     $DocumentRoot = "/srv/www/".$My::dir; 

     $Directory {"/srv/www/".$My::dir} = { 
      AllowOverride  => "All", 
      Order    => "allow,deny", 
      deny     => "from all", 
      Satisfy    => "Any", 
      Require    => "valid-user", 
      AuthType    => "Basic", 
      AuthName    => "Achtung",    
      AuthBasicProvider => "socache dbd",    
      AuthnCacheProvideFor => "dbd",    
      AuthnCacheContext => "Test",    
      AuthnCacheTimeout => "60", 
      AuthDBDUserPWQuery => "SELECT `user_passwd` FROM prev_user` WHERE `host_name` = '".$My::dir"' AND `user_name` = %s"    
     }; 
    </Perl> 
</VirtualHost> 

問題がある:


これは、実際の問題が始まる異なるプロジェクトのためのデータベース・ログインと私たちの最終的な解決策でありますperlセクションのディレクティブを使用して、それを仮想ホストに直接置くと、期待どおりに動作し、プロンプトが表示され、データベースパラメータを使用してログインする必要があります。あまりにも悪いので、これは実際には動作しませんので、クエリ内で動的ホストを使用するオプションはありません。

<VirtualHost *:80> 
    <Perl> 
     [...] 
     $Directory {"/srv/www/".$My::dir} = { 
      AllowOverride  => "All", 
      Order    => "allow,deny", 
      deny     => "from all", 
      Satisfy    => "Any", 
      Require    => "valid-user", 
      AuthType    => "Basic", 
      AuthName    => "Achtung",    
      AuthBasicProvider => "socache dbd",    
      AuthnCacheProvideFor => "dbd",    
      AuthnCacheContext => "Test",    
      AuthnCacheTimeout => "60"   
     }; 
    </Perl> 

    <Directory /srv/www/websites/admin> 
     AuthDBDUserPWQuery "SELECT `user_passwd` FROM prev_user` WHERE `host_name` = '[NEED DYNAMIC HOST HERE]' AND `user_name` = %s" 
    </Directory>  
</VirtualHost> 

次の部分でいくつかの奇妙な問題があるようです:任意の提案

$Directory {"/srv/www/".$My::dir} = { 
      [...] 
      AuthDBDUserPWQuery => "SELECT `user_passwd` FROM prev_user` WHERE `host_name` = '".$My::dir"' AND `user_name` = %s"    
}; 

答えて

0

詳細については、

mod_perlのバグと思われます。クエリ内のスペースをクリアすると、文字列は1つの値として解釈されます。明らかに、スペースは複数の値として解釈される文字列になります。

だから、解決策は以下のとおりです。

$Directory {"/srv/www/".$My::dir} = { 
     [...] 
     AuthDBDUserPWQuery => "SELECT`user_passwd`FROM`prev_user`WHERE`host_name`='".$My::dir"'AND`user_name`=%s" 
} 

非常に汚いと紛らわしいが、それは動作します。

関連する問題