如何检查用户是否属于java中的某个AD组

我知道这肯定是一个非常简单的问题,但是我对java很陌生,并且很难得到我需要的确切代码。 我需要做的是从Windows获取当前login用户名,并检查该用户是否属于某个configuration文件中需要定义的特定AD用户组。 在C#中执行起来非常简单,但我不知道如何在JAVA中执行它。 示例代码会很好。 在c#中,我将安全组放入App.Config到应用程序设置,然后我可以抓取当前login的用户的Windows身份,然后遍历用户所属的所有组,并与所需的匹配。 我需要在java中完全相同

如果您只关心当前登录的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在用户登录时缓存所有组(包括用户所属的其他组)的用户成员身份的事实。


这里的要求似乎是非特定的,这开始转向可能不适合这样的领域,但我仍然会放弃它。

最终,系统运行的地点决定了设置的难度。 如果你打算在一个基于Windows的服务器上运行,那么你应该看看Waffle ,它提供了一个servlet,一个Spring Security过滤器,一个JAAS插件和其他一些方法可以实现Windows集成身份验证,该集成身份验证使用本机Windows方法加载Windows身份和关联的Active Directory组。 这将为您提供与.NET框架应用程序使用IIS和WIA最相似的体验。 与此不同的是,服务器需要在Windows系统上运行。

不幸的是,在非Windows环境下运行需要更多的设置和配置。 最集成的解决方案可能是Spring Security,它具有能够提供SPNEGO(Windows集成身份验证) 的Kerberos扩展 。 上面的链接有详细信息(我相信他们仍然是最新的),以便让Kerberos过滤器运行起来。 要访问组信息,您需要更改示例security.xml文件中的userDetailsService值。 这里最简单的事情就是在这里提供一个适当配置的LdapUserDetailsS​​ervice作为对象。 我不是所有与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和纯Java SPNEGO过滤器来滚动你自己的版本,但是显示一个例子需要基本编写一个程序。

我希望这有帮助。 一旦你决定采取一种方法,把更具体的问题作为SO型问题来解决也许是适当的。

你可以得到所有没有JNA的组,像这样:

 String groups[] = (new com.sun.security.auth.module.NTSystem()).getGroupIDs(); 

显然这只能在Windows上运行,甚至在Windows上也是不鼓励使用com.sun。*软件包。 看到这个结果的解释。

这可以通过Java SE API完成,而不需要直接使用com.sun。*包。 使用Java身份验证和授权服务(JAAS) (javax.security.auth。*和javax.security.auth.login。*)来访问此信息。 使用以下条目创建JAAS配置文件 :

 sampleApp { com.sun.security.auth.module.NTLoginmodulee required debug=false; }; 

将该条目另存为sampleapp_jaas.config 。 接下来设置系统属性,以便Java将查找配置文件。

 -Djava.security.auth.login.config==sampleapp_jaas.config 

请注意,double等于特殊含义。 有关加载顺序的详细信息,请参阅com.sun.security.auth.login.ConfigFile 。

然后创建LoginContext来查找JAAS配置中的条目。 调用登录来填充主题,然后访问代表用户组的主体。

 LoginContext l = new LoginContext("sampleApp"); l.login(); try { Subject s = l.getSubject(); for (Principal p : s.getPrincipals()) { System.out.println(p); } } finally { l.logout(); } 

使用这个设置,Java将使用com.sun.security.auth.module.NTSystem类来获取信息,但是没有一个代码会被硬连线到非标准的API。