如果您只关心当前登录的 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 的服务器上运行,该服务器连接到您正在验证的同一个域,那么您应该查看Waffle,它提供了一个 servlet、一个 Spring Security 过滤器、一个 JAAS 插件和其他一些方式您可以实施 Windows 集成身份验证,该身份验证使用本机 Windows 方法来加载 Windows 身份和关联的 Active Directory 组。这将为您提供最类似于将 IIS 和 WIA 与 .NET 框架应用程序一起使用的体验。这样做的缺点是服务器需要在 Windows 系统上运行。
不幸的是,在非 Windows 环境中运行将需要更多设置和配置。集成度最高的解决方案可能是 Spring Security,它的 a Kerberos extension 能够提供 SPNEGO(Windows 集成身份验证)。上面的链接包含有关启动和运行 Kerberos 过滤器所需的详细信息(我相信它们仍然是最新的)。要访问组信息,您需要更改示例 security.xml 文件中的 userDetailsService 值。这里最简单的做法是提供一个适当配置的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 和 the pure-Java SPNEGO filter 滚动您自己的版本,但展示一个示例需要基本上编写一个程序。
我希望这会有所帮助。一旦您决定了一种方法,可能适合将更具体的问题作为 SO 类型的问题来解决。