我正在处理一个旧系统,该系统使用带有 mod_auth_basic 和 mod_authnz_ldap 的 Apache 在给定目录以及带有 .htaccess 文件的目录中进行身份验证和授权。然后将经过身份验证的用户提供给各种 CGI 脚本。
如果可能的话,我想在 Apache httpd.conf 配置文件中强制所有用户名都为小写。这样,我只需更新一个配置文件并重新启动服务器,就可以跳过更新数十个旧 CGI 文件以强制用户名为小写(最终会用到)。
我想要为其提供小写用户名的 CGI 脚本目录已受保护,AuthType Basic
后跟AuthBasicProvider ldap
特定AuthLDAPURL
于我的情况的 。此身份验证有效。
我最初尝试使用 mod_rewrite,但后来才意识到 mod_rewrite 主要用于重写 URL。
这可能吗?我是否缺少一些可以让我通过 mod_auth_basic 或 mod_authnz_ldap 强制将用户名转换为小写的东西?
答案1
基于https://stackoverflow.com/a/31242711/773806我能够解决这个问题。
- 我首先确保所有相关环境中都安装了 mod_perl 2。
- 然后我将以下内容添加到我的 httpd.conf 文件中:
PerlRequire /etc/httpd/scripts/startup.pl
PerlHeaderParserHandler MyApache2::ConvertUserToLowercase
- 我创建了目录
/etc/httpd/scripts
和/etc/httpd/scripts/MyApache2
。 - 我创建了包含以下内容的
/etc/httpd/scripts
文件:startup.pl
use lib qw(/etc/httpd/scripts/);
1;
- 在其中
/etc/httpd/scripts/MyApache2
我创建了该文件ConvertUserToLowercase.pm
并添加了以下内容:
package MyApache2::ConvertUserToLowercase;
use strict;
use warnings FATAL => 'all';
use APR::Base64;
use Apache2::Access;
use Apache2::Const -compile => qw(OK DECLINED HTTP_UNAUTHORIZED);
use Apache2::RequestRec;
use APR::Table ();
sub handler {
my $request = shift;
my ($code, $password) = $request->get_basic_auth_pw();
if ($code == Apache2::Const::OK) {
my $user = lc $request->user;
my $auth_header = APR::Base64::encode("$user:$password");
$request->headers_in->{'Authorization'} = "Basic $auth_header";
}
return Apache2::Const::OK;
}
1;
- 确保所有文件都可以被 Apache 读取。
- 然后使用 测试服务器配置
httpd -t
并重新启动sudo systemctl restart httpd
。