だから。 前回この構成に落ち着いた時:
{auth_method、ldap}、%認証方法-LDAP {ldap_servers、["ldap.company.local"]}、%LDAPサーバーアドレス {ldap_port、389}、%そのポート {ldap_base、 "ou = people、dc = company、dc = local"}%ユーザーアカウントのベースDN
これで、LDAPアカウントを持つすべてのユーザーがサーバーを使用できるようになりました。 これは私にはあまり適していません。この機会を従業員にだけ与えたいです。 すべての従業員は従業員グループに属しています(cn =従業員、ou =グループ、dc =会社、dc =ローカル)。
一見、 ldap_filterパラメーターで目標を達成できます。 しかし、これは初めてです。 私が見つけたすべての例(およびそれらの多くを検討しました)では、 アカウントオブジェクトのmemberOf属性が使用されているか、意味が似ています。 残念ながら(OpenLDAPに基づく)構成では、そのような属性はありませんでした。
LDAPフィルターガイドとejabberd機能を何時間も勉強した後、私は自分の認証プログラムを試すことにしました。
外部プログラムの接続
これは非常に簡単に行われます:
{auth_method、external}。 {extauth_program、 "/ path / to / program / program_name"}。
ここで、
/path/to/program/program_name
、認証プログラムへのパスです。
プログラム装置
すべてが非常に簡単です。 プログラムは無限ループで実行され、標準入力から要求を読み取り、結果を標準出力に書き込みます。
要求と応答の前には、要求/応答の長さを含む2バイトがあります。
要求は次のとおりです。
- auth:ユーザー:サーバー:パスワード(認証データの確認)
- isuser:ユーザー:サーバー(ユーザーの存在を確認)
- setpass:ユーザー:サーバー:パスワード(ユーザーの新しいパスワードを設定)
応答として、プログラムは要求が正常に完了した場合は1を送信し、失敗した場合は0を送信する必要があります。
参照資料
簡単な例
以下は、外部PHP認証プログラムの簡単な例です。 PHPが使用されたのは、LDAPサーバーを操作するための既製のライブラリが既にあったためです。
#!/ usr / local / bin / php <?php 'ldap3w.php'が必要です。 $ ldap = new LDAPConnection(); while(true){ $ length = @fgets(STDIN、3); $ length = @unpack( 'n'、$ length); $ length = $ length [1]; if($ length> 0){ $ result = false; $ account = false; $ data = @fgets(STDIN、$ length + 1); $ data = explode( ':'、$ data); スイッチ($データ[0]){ ケース「auth」: $ account = $ ldap-> getAccount($ data [1]、$ data [3]); 休憩; ケース「isuser」: $ account = $ ldap-> getAccount($ data [1]); 休憩; } if($アカウント){ $グループ= $アカウント->メンバーシップ(); $ result = in_array( 'employees'、$ groups); } $ result = @pack( 'nn'、2、intval($ result)); @fputs(STDOUT、$結果); } }