0
介绍: 我们公司通过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进入游戏的地方。
这是我们的数据库登录为不同的项目和地方的实际问题开始最终的解决方案:
<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>
问题是 - 阿帕奇说:
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
如果我删除伪指令并将其直接放入虚拟主机,它将按预期方式工作,用户将获得提示并通过数据库参数登录。太糟糕了,没有选择在查询中使用动态主机,所以这不会真正起作用。
<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"
};
有什么建议?