首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mod_perl + mod_authn_dbd不接受AuthDBDUserPWQuery

mod_perl + mod_authn_dbd不接受AuthDBDUserPWQuery
EN

Stack Overflow用户
提问于 2017-08-10 09:45:00
回答 1查看 124关注 0票数 0

我们公司使用通过mod_perl动态生成的vhost从我们的数据库中生成vhost。我们基本上有一个表“域”,是为我们的数百个客户和合作伙伴动态修改。

我们有几种不同别名、包含和规则的模板。因此,我们基本上使用以下Perl脚本生成不同的模板:

代码语言:javascript
复制
<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进入游戏的原因。

这是我们针对不同项目的数据库登录的最后解决方案,也是实际问题开始的地方:

代码语言:javascript
复制
<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>

问题是-阿帕奇说:

代码语言:javascript
复制
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,它将按预期工作,用户将得到提示,并必须通过数据库参数登录。糟糕的是,在查询中没有使用动态主机的选项,所以这不会真正起作用。

代码语言:javascript
复制
<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>

以下部分似乎有一些奇怪的问题:

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

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2017-08-10 12:10:54

欲进一步了解情况:

似乎是mod_perl中的一个bug。清除查询中的空格将导致字符串被解释为一个值。显然,空格会导致字符串被解释为多个值。

因此,解决办法是:

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

很脏很让人困惑但很管用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45610127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档