php5-auth-pamを交換して、ローカルユーザーのウェブサイトログインを認証します。

php5-auth-pamを交換して、ローカルユーザーのウェブサイトログインを認証します。

私はPHPベースのウェブサイトへのログイン作業をしていますが、ユーザーがシステムに有効なユーザー名とパスワードを入力するとログインが成功します。周りを見回すと、伝統的なアプローチは次のとおりです。PHP PAMモジュール

残念ながら、このモジュールは次のようになります。廃止apt-get install php5-pam-authUbuntu Server 14.04にはインストールできなくなりました。 forceを使用してインストールできましたが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がマルチスレッドであってもなくてもよいWebサーバーに接続することが多いという点を含め、多くの問題があります。あります。ヒット率(pamはより低いヒット率を想定しています)とphp pamソリューションはスケーラブルではありません(一部のアプリケーションでは便利です)。

これらの変更により、お客様の問題に対する解決策は基本的に3つのカテゴリに分けられます。最も少なく推奨される観点からは、

  1. 自分で書いてみてください。
  2. ヘルパープロセスを使用します。
  3. バイパスパム。

これまでに得た経験なしに自分で書くことは、私が言及したすべての困難に従います。ヘルパープロセスは pam と php を別々のプロセスに分け、多くの問題を管理可能なレベルに減らし、IPC を増やします。最も一般的な解決策は、PHPとオペレーティングシステムが同じデータベース(たとえばldap)またはSQLデータベース(mysqlやpostgresなど)に対して認証できるようにすることです。これを行うには、いつでもモジュールを使用できます。

唯一の他の解決策は、PHPで認証せずにサーバー(pam authモジュールはapacheで利用可能)または他の方法(cgiとmod_perlの両方でpam認証を実行しますが、セッションを前後に転送することは少なくとも機能します)で認証することです。 。面白いと言いました。 .)

あなたの場合は、補助プロセスをお勧めします。 (ApacheにはPHPを使用せずにこれを簡単に行う方法があります。)

関連情報