我正在尝试完成 Redmine 的功能请求#2693:使用 Redmine.pm 对任何目录进行身份验证(1). 我对这些东西不太了解,需要帮助。Redmine 使用mod_perl
模块Redmine官方博客用于身份验证和授权。此模块定义了几个自定义配置指令。我已成功修改了 (1) 中的补丁,当所有配置都位于以下位置时,它可以正常工作<Location>
:
<Location /digischrank/test>
AuthType basic
AuthName "Digischrank Test"
Require valid-user
PerlAccessHandler Apache::Authn::Redmine::access_handler
PerlAuthenHandler Apache::Authn::Redmine::authen_handler
RedmineDSN "DBI:mysql:database=SomedaTaBAse;host=localhost"
RedmineDbUser "SoMeuSer"
RedmineDbPass "SomePaSS"
RedmineProject "digischrank"
</Location>
但是当我在文件中移动其中一个指令(RedmineProject
,参见 (1))时.htaccess
,Redmine.pm 看不到它!我尝试更改<Location>
为<Directory>
并添加AllowOverride All
。 来自的指令.htaccess
可见,但来自的其余指令<Directory>
不可见。我不想将所有指令移动到每个.htaccess
。当我添加,<Location>
除了<Directory>
,再次 - 只有来自的指令<Location>
可见。
据我所知,指令应该合并。我遗漏了什么吗?
答案1
我发现 Redmine.pm 没有提供 DIR_MERGE 函数来合并配置对象。详情请参阅创建和合并配置对象手册部分mod_perl
。我简化了给出的示例,因为我只需要覆盖模式:
sub DIR_MERGE { merge(@_) }
sub merge {
my ($base, $add) = @_;
my %mrg = ();
for my $key (keys %$base, keys %$add) {
next if exists $mrg{$key};
# override mode
$mrg{$key} = $base->{$key} if exists $base->{$key};
$mrg{$key} = $add->{$key} if exists $add->{$key};
}
return bless \%mrg, ref($base);
}