次の問題があります。
サーバーと通信するリッチ クライアント (Java) をデスクトップ コンピューターで実行しています。リッチ クライアントを起動すると、ユーザー名とパスワードの入力を求められます。リッチクライアントはそれをサーバーに送信し、サーバーは「はい、アクセスを許可します」または「アクセスを許可しません」と言います。
ここで、もう少しユーザー エクスペリエンスを提供したいと考えています。ユーザーが Windows にログインしてリッチ クライアントを起動すると、リッチ クライアントは自動的に現在のユーザーをチェックし、このユーザーが許可されているかどうかを LDAP (Active Directory) に問い合わせます。いいえ。
私はLDAPをまったく初めて使用しますが、これまでに次のことを理解しました:
次の方法で現在のユーザーを取得できます。
userName = new com.sun.security.auth.module.NTSystem().getName();
次のように Waffle を使用してドメインを取得できます。
WindowsAuthProviderImpl auth = new WindowsAuthProviderImpl();
for(IWindowsDomain domain : auth.getDomains())
userDomain = domain.getFqn();
これで、既知の LDAP アカウントを取得して、この特定のユーザーを検索できます。
Hashtable<String, String> props = new Hashtable<String, String>();
props.put(Context.SECURITY_PRINCIPAL, "admin");
props.put(Context.SECURITY_CREDENTIALS, "123");
DirContext context = LdapCtxFactory.getLdapCtxInstance("ldap://host:12345/", props);
String filter = "(& (userPrincipalName=" + userName + "@" + userDomain + ")(objectClass=user))";
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
context.search(dc, filter, controls);
最後に、必要なユーザーに関する情報を取得しました。しかし:
- 保存ですか?または、誰かが簡単にユーザー名とドメインを偽造できますか?
- LDAP サーバーに接続するための「admin」ユーザーを削除したいと考えています。現在のユーザーを取得して、それに接続しようとします。しかし、どのように?LDAP サーバーに接続するにはパスワードが必要ですが、Windows はもちろんパスワードを教えてくれません。
では、Windows で現在ログインしているユーザーを LDAP に対して検証/確認するにはどうすればよいですか?
私がこれまでに行ったことは複雑に思え、間違っていると感じています。意味が分からなかったと思います…
編集:
次のように、Waffle から現在のユーザーのグループを取得することもできます。
WindowsAuthProviderImpl auth = new WindowsAuthProviderImpl();
IWindowsIdentity identity = auth.logonUser(user, pwd);
for(IWindowsAccount group : identity.getGroups())
group.getFqn();
しかし、既に Windows にログインしているのに、もう一度パスワードが必要です...