我的公司目前正在尝试实施一个新的基于 Perl FastCGI 的登录脚本,以便与 Apache 2.4 的mod_fcgid
模块配合使用。我们以前的脚本依赖mod_perl
于 Apache 的基本身份验证和 Perl 之间的桥梁,但mod_perl
在 RHEL 8 中不再可用。
在过去两周里,我做了大量的研究,但还是没能让它工作。我承认我对 Apache 的了解非常有限,我是一名程序员,我所知道的东西基本上都是自学的,所以如果这是件微不足道的事情,我提前道歉。
以下是我的虚拟服务器配置,基于mod_fcgid 文档:
<VirtualHost *:80>
ServerAdmin [email protected]
DocumentRoot "/var/www/"
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/teste_fcgi_autenticador/"
ServerName teste_autenticacao.ourserver.com
<Directory /var/www/cgi-bin/teste_fcgi_autenticador>
Options +ExecCGI +FollowSymLinks
AllowOverride AuthConfig
AddHandler fcgid-script .cgi .pl
AuthType Basic
AuthName "Simple_login"
#AuthUserFile /var/www/cgi-bin/teste_fcgi_autenticador/.htpasswd
FcgidAuthenticator /usr/lib64/perl5/Autenticador/autenticador.pl
Require valid-user
</Directory>
ErrorLog /var/log/httpd/error_log
CustomLog /var/log/httpd/access_log combined
</VirtualHost>
运行上述命令而不使用AuthType
andAuthName
似乎确实有效,如错误日志所示:
mod_fcgid: authenticator requires basic HTTP auth credentials
No authentication done but request not allowed without authentication for /cgi-bin/teste.pl. Authentication not configured?
当我添加这些标签时,日志会抱怨AuthUserFile
缺少内容,这意味着它需要的是.htpasswrd
文件而不是我的脚本。
当我尝试使用 运行此服务器配置时,它就像一个魅力一样工作,但是从文件而不是我的脚本AuthUserFile
验证用户/密码。.htpasswrd
我还尝试将此配置添加到fcgid.conf
,如下所示,使用旧的和新的指定,但没有成功:
# This is the Apache server configuration file for providing FastCGI support
# through mod_fcgid
#
# Documentation is available at
# http://httpd.apache.org/mod_fcgid/mod/mod_fcgid.html
# Use FastCGI to process .fcg .fcgi & .fpl scripts
AddHandler fcgid-script fcg fcgi fpl
# Sane place to put sockets and shared memory file
FcgidIPCDir /run/mod_fcgid
FcgidProcessTableFile /run/mod_fcgid/fcgid_shm
# Function that handles authentication
#FastCgiAuthenticator /usr/lib64/perl5/Autenticador/autenticador.pl
FcgidAuthenticator /usr/lib64/perl5/Autenticador/autenticador.pl
autenticador.pl
以下是我们尝试运行的Perl 脚本- 示例取自mod_authnz_fcgi 文档(该文件及其所在的文件夹均具有完全权限):
#!/usr/bin/perl
use FCGI;
my $request = FCGI::Request();
while ($request->Accept() >= 0) {
die if $ENV{'FCGI_APACHE_ROLE'} ne "AUTHENTICATOR";
die if $ENV{'FCGI_ROLE'} ne "AUTHORIZER";
die if !$ENV{'REMOTE_PASSWD'};
die if !$ENV{'REMOTE_USER'};
print STDERR "This text is written to the web server error log.\n";
if ( ($ENV{'REMOTE_USER' } eq "foo" || $ENV{'REMOTE_USER'} eq "foo1") &&
$ENV{'REMOTE_PASSWD'} eq "bar" ) {
print "Status: 200\n";
print "Variable-AUTHN_1: authn_01\n";
print "Variable-AUTHN_2: authn_02\n";
print "\n";
}
else {
print "Status: 401\n\n";
}
}
注意:我们不使用mod_authnz_fcgi
,因为它在 RHEL 8 的 Apache 2.4 版本中不可用。我们目前只使用脚本 - 从 shell 调用时,该脚本确实按预期工作。如果您知道如何安装和运行此模块,请告诉我。
供参考的系统配置: 运行 RHEL 8 Apache 2.4.37 Perl 5.26.3 的
Amazon AWS 服务器
提前感谢您的任何想法。