[英]mod_perl + mod_authn_dbd does not accept AuthDBDUserPWQuery
簡介:我們公司通過mod_perl使用動態生成的虛擬主機從數據庫中生成虛擬主機。 我們基本上有一個表“域”,可以為數百個客戶和合作伙伴動態地對其進行修改。
我們有幾種具有不同別名,包含和規則的模板。 因此,我們基本上使用以下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進入游戲的地方。
這是我們針對不同項目的數據庫登錄的最終解決方案,而實際問題的開始之處是:
<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>
問題是-Apache說:
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
如果我從perl部分中刪除指令並將其直接放入vhost中,它將按預期工作,並且用戶將得到提示,並且必須通過數據庫參數登錄。 太糟糕了,無法在查詢中使用動態主機,因此這實際上無法工作。
<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"
};
有什么建議么?
了解更多信息:
似乎是mod_perl中的錯誤。 清除查詢中的空格會導致字符串被解釋為一個值。 顯然,空格導致字符串被解釋為多個值。
因此解決方案是:
$Directory {"/srv/www/".$My::dir} = {
[...]
AuthDBDUserPWQuery => "SELECT`user_passwd`FROM`prev_user`WHERE`host_name`='".$My::dir"'AND`user_name`=%s"
}
非常骯臟和混亂,但是可以工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.