Delphi でも LDAP
|
|
軽井沢、白糸の滝。夏休み最後の日曜日、案外犬を連れた人が多かった。 |
Novell eDirectory へのLDAP認証だが、Delphiでも試してみた。クグってみたところ、SynapseというDelphiで使えるTCP/IPツールにLDAPクライアントが見つかった。Synapseは以前にも別の目的で試したことがあったが、LDAPは今回が初めてだ。
LDAPサーバーへの接続は簡単だ。今回は、ユーザーIDとパスワードで認証し、OKならアトリビュート値を返すような関数にしてみた。
LdapSeek というユニット仕立てだ。
{*
* [Ararat Synapse] を使用して LDAP(eDirectory) にアクセスする
* Copyright(c) flyman
* Version 0.10 2008/09/10
*}
unit LdapSeek;
interface
uses
Classes, Windows, SysUtils, ldapsend;
Function LdapAuth(userID, password : String; AttrList : TStringList) : Boolean;
var
Host : String;
Port : String;
Version : Integer;
Search : String;
implementation
{指定ユーザー、パスワードの認証
認証に成功すると、AttrListにアトリビュート値が入る
認証に失敗すると False を返す}
Function LdapAuth(userID, password : String; AttrList : TStringList) : Boolean;
var
ldap: TLDAPsend;
al,gl : TStringList;
begin
Result := True;
AttrList.Clear;
ldap:= TLDAPsend.Create;
al := TStringList.Create;
gl := TStringList.Create;
try
ldap.TargetHost := Host;
ldap.TargetPort := Port;
ldap.Version := Version;
if ldap.Login then begin
ldap.UserName := 'cn=' + userID + Search;
ldap.Password := password;
if ldap.Bind then begin
{検索したいアトリビュート名のリストを作る}
al.Append('dn');
al.Append('passwordMinimumLength');
al.Append('loginDisabled');
al.Append('nLSLicensesUsed');
al.Append('sn');
al.Append('nRDRegistryData');
al.Append('loginMaximumSimultaneous');
al.Append('passwordRequired');
al.Append('Language');
al.Append('passwordAllowChange');
al.Append('objectClass');
al.Append('uid');
al.Append('groupMembership');
al.Append('loginTime');
al.Append('cn');
al.Append('securityEquals');
al.Append('ACL');
al.Append('nRDRegistryIndex');
al.Append('networkAddress');
al.Append('fullName');
al.Append('ndsHomeDirectory');
ldap.Search('cn=' + userID + Search, False, '(objectclass=*)', al);
gl.Text := LDAPResultdump(ldap.SearchResult);
AttrList.AddStrings(gl);
end else begin
AttrList.Add('*** Bind Failure ***');
Result := False;
end;
ldap.Logout;
end else begin
AttrList.Add('*** Login Failure ***');
Result := False;
end;
finally
ldap.Free;
al.Free;
gl.Free;
end;
end;
end.
こんな感じだ。なんのことはない、eDirectoryだからといって、特段変わったテクニックは必要ない。
認証が必要なければ ldap.UserName と ldap.Password をブランクにしておけば Anonymusで接続してくれる。その上で ldap.Search すれば必要なアトリビュート値を取り出すことが可能だ。
この関数は、Formのボタン押下イベントから、以下のようにして呼び出す。
uses LdapSeek;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
AttrList : TStringList;
begin
Memo1.Lines.Clear;
LdapSeek.Host := '10.9.225.214';
LdapSeek.Port := '389';
LdapSeek.Version := 3;
LdapSeek.Search := ',ou=users,o=flynet';
Screen.Cursor := crHourGlass;
AttrList := TStringList.Create;
try
// ユーザーID、パスワード、アトリビュート値の入れ物を渡す
if LdapAuth(EditUSER.Text, EditPASS.Text, AttrList) then begin
// ここに認証成功時の処理を書く
end else begin
// 認証失敗 !!
end;
Memo1.Lines.AddStrings(AttrList);
finally
AttrList.Free;
Screen.Cursor := crDefault;
end;
end;
――サンプル用コードとしてはちょっと適当じゃないかも知れないが、まあ、こんな感じで作ってしまったので勘弁して欲しい。
* LdapSeek の uses に余計なモノが入っている。オリジナルでは他にも関数やプロシージャを入れているので、それ用のユニットも読み込ませているのだ(どれが不要だか判らなくなったので、そのまま残してある)。
LDAPサーバーに認証要求を投げたり、PCのログインユーザーの所属するグループ一覧を取得したり、色々な用途が思い浮かぶ。
私はまだ試していないが、LDAPサーバーの値(LDIF)を書き換えることも可能なようだ。
今回は Novell eDirectory が相手だったが、Active Directory でも、OpenLdap でも、基本は同じみたいなので勤務先のディレクトリサービスが変更になっても大丈夫、使えるワザである。
TrackBacks
TrackBack URL : http://www.kestrel.jp/modules/wordpress/wp-trackback.php/140
この投稿には、まだコメントが付いていません
