非常に簡単な質問であることはわかっていますが、私は Java を初めて使用するので、必要な正確なコードを取得するのが難しいと感じています。私ができる必要があるのは、Windows から現在ログインしているユーザー名を取得し、このユーザーが構成ファイルで定義する必要がある特定の AD ユーザー グループに属しているかどうかを確認することです。C# なら簡単にできますが、JAVA ではどうすればいいのかわかりません。サンプルコードは素晴らしいでしょう。C# では、セキュリティ グループを App.Config のアプリ設定に配置し、現在ログインしているユーザーの Windows ID を取得して、ユーザーが属するすべてのグループを反復処理し、目的のグループと一致させることができます。Javaでもまったく同じことをする必要があります
3 に答える
現在ログオンしている Windows ユーザー (つまり、Java プログラムが Windows で実行される) のみに関心があり、 JNAを使用することを気にしない場合はplatform.jar
、 で提供されている関数を使用しAdvapi32Util#getCurrentUserGroups()
て、ユーザーがメンバーであるグループを取得できます。 .
例えば:
import com.sun.jna.platform.win32.Advapi32Util;
for (Advapi32Util.Account account : Advapi32Util.getCurrentUserGroups()) {
System.out.println(account.fqn);
}
これは、ユーザーがログオンしたときに Windows がすべてのグループ (ユーザーがメンバーである他のグループを含むグループを含む) のユーザー メンバーシップをキャッシュするという事実も利用します。
ここでの要件は特定されていないように見えます。これは、おそらく SO にはあまり適していない領域に方向転換し始めていますが、とにかくやってみます。
最終的に、システムをどこで実行するかによって、セットアップの難易度が決まります。認証しているのと同じドメインに接続された Windows ベースのサーバーで実行する場合は、サーブレット、Spring Security フィルター、JAAS プラグイン、およびその他のいくつかの方法を提供するWaffleを確認する必要があります。ネイティブの Windows メソッドを使用して Windows ID と関連する Active Directory グループをロードする Windows 統合認証を実装できます。これにより、IIS と WIA を .NET Framework アプリケーションで使用するのと最も似たエクスペリエンスが提供されます。これの欠点は、サーバーを Windows システムで実行する必要があることです。
残念ながら、Windows 以外の環境で実行するには、より多くのセットアップと構成が必要になります。最も統合されたソリューションは、おそらくSPNEGO (Windows 統合認証) を提供できるKerberos 拡張機能を持つ Spring Security です。上記のリンクには、Kerberos フィルターを起動して実行するために必要なものに関する詳細が記載されています (まだ最新のものであると思います)。グループ情報にアクセスするには、サンプルファイルのuserDetailsService
値を変更する必要があります。security.xml
ここで行う最も簡単な方法は、適切に構成されたLdapUserDetailsServiceをオブジェクトとして提供することです。私はSpringの経験が豊富ではありませんが、構成は次のようになります(これには がありませcontextSource
ん)。
<bean id="adUserSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<constructor-arg value="dc=domain,dc=com"/>
<constructor-arg value="(sAMAccountName={0})"/>
<constructor-arg ref="contextSource" />
</bean>
<bean id="adAuthoritiesPopulator" class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
<constructor-arg ref="contextSource"/>
<constructor-arg value="dc=domain,dc=com" />
<property name="groupSearchFilter" value="(member={0})"/>
<property name="rolePrefix" value="ROLE_"/>
<property name="searchSubtree" value="true"/>
<property name="convertToUpperCase" value="true"/>
</bean>
<bean id="userDetailsService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService">
<constructor-arg ref="adUserSearch"/>
<constructor-arg ref="adAuthoritiesPopulator"/>
</bean>
これにより、関連付けられたグループを持つ Kerberos 認証済みユーザーが取得されます。
Spring Security が受け入れられない場合は、おそらくShiroとpure-Java SPNEGO filterを使用して独自のバージョンを展開してみることができますが、その例を示すには基本的にプログラムを作成する必要があります。
これが役立つことを願っています。アプローチを決定したら、SO タイプの質問として、より具体的な質問に対処することがおそらく適切です。
次のように、JNA なしですべてのグループを取得できます。
String groups[] = (new com.sun.security.auth.module.NTSystem()).getGroupIDs();
明らかに、これは Windows でのみ機能し、Windows でも com.sun.* パッケージの使用はお勧めできません。結果の説明はこちらをご覧ください。