Net::LDAPでのbind
久しぶりにCGIを書きました。LDAPのパスワードを変更するためのCGIです。LDAPをperlから使うのでNet::LDAPを使ってプログラム。入力されたuseridをつかってanonymousでDNをsearchするところまではうまくいったのですが、そのDNをつかってパスワード認証でのbindがどうしてもできない。
$dn="cn=hoge,ou=person,dc=hoge,dc=org" ; $password = "secret" ; $ldap = Net::LDAP->new('localhost'); $mesg = $ldap->bind ( $dn, password=>$password );
てなことをやってもInvalid credential、つまりパスワードが違うとのこと。
どうもディレクトリに収められているパスワードがSSHAでハッシュされているのが原因みたい。このパスワードの属性をplain textにしてやるとちゃんとバインドできる。
Digest::SHA1をつかって、ハッシュ値をつくってからpasswordに与えてもNG。うーむ。
あんまり考えると頭がいたくなるので、ldappasswdコマンドをつかってパスワード変更することにしました。
こんなところ。
$passchg = `/usr/bin/ldappsswd -x -D $dn -w $oldpassword -s $newpassword` ; print $passchg ;
なんか敗北感いっぱいな感じ。なにかいい方法がありそうな気がするんだけどな。