替换 php5-auth-pam 以针对本地用户验证网站登录

替换 php5-auth-pam 以针对本地用户验证网站登录

我正在为一个基于 PHP 的网站进行登录,如果用户在系统上输入有效的用户名和密码,则应该成功登录。环顾四周,传统的做法似乎是使用PHP PAM 模块

不幸的是,这个模块现在看起来像已弃用我无法再apt-get install php5-pam-auth在 Ubuntu Server 14.04 中安装它。我能够使用 强制安装它pecl install pam,但即使这样它仍然无法工作,因为使用它需要通过引用进行调用时间传递,如下所示:

if ( pam_auth( $uname, $pswd, &$error ) ) {
    echo "You are authenticated!"
}

...这导致 PHP 抱怨调用时通过引用传递也已被弃用:

[Fri Jul 24 01:25:35.788680 2015] [:error] [pid 25328] [client xx.xxx.xx.xx:1179] PHP Fatal error:  Call-time pass-by-reference has been removed in /var/www/academies/phptest/login.php on line 7, referer: http://<domain>:81/phptest/

有更新的或替代的方法来做到这一点吗?我确实找到了这个答案类似的问题,但我无法编译 C 代码;它给了我以下错误:

pam.c: In function ‘authenticate’:
pam.c:63:9: error: expected declaration or statement at end of input
         return ( retval == PAM_SUCCESS ? 0:1 );
         ^

据介绍phpinfo(),我正在运行PHP版本5.5.9-1ubuntu4.11

答案1

我不同意贬低 php-auth-pam 的决定,尽管我可以理解他们这样做的原因。集成 php 和 pam 存在许多挑战,包括 php 经常链接到您的网络服务器,该服务器可能是也可能不是多线程的(并且使用 pam 处理多个线程可能会出现问题),php 往往具有非常高的命中率(其中pam 假定命中率较低),而 php pam 解决方案的扩展性不佳(尽管它们在某些应用程序中可能很有用。

通过此更改,基本上可以为您的困难提供三类解决方案。从最不推荐的角度来看,它们是:

  1. 写你自己的。
  2. 使用辅助进程。
  3. 绕过 pam。

如果没有到目前为止所获得的经验,自己编写会面临我已经提到的所有挑战。帮助程序进程将 pam 和 php 分成单独的进程,这将许多挑战降低到可管理的级别,但增加了 IPC。最常见的解决方案是让 php 和操作系统针对同一数据库(例如 ldap)或 SQL 数据库(例如 mysql 或 postgres)进行身份验证。可以随时使用模块来执行此操作。

唯一的其他解决方案是不在 php 中进行身份验证,而是在服务器中进行身份验证(pam 身份验证模块可用于 apache)或其他方法(cgi 和 mod_perl 都可以进行 pam 身份验证,但来回传递会话至少可以说很有趣。 )

对于你的情况,我会推荐一个辅助进程。 (apache 有一个简单的方法可以做到这一点,而无需涉及 php。)

相关内容