如何在java中检查用户是否属于某个广告组

如何在java中检查用户是否属于某个广告组,java,windows,active-directory,Java,Windows,Active Directory,我知道这一定是一个非常简单的问题,但我对java是新手,很难得到我需要的确切代码。我需要能够做的是从Windows获取当前登录的用户名,并检查该用户是否属于需要在某些配置文件中定义的特定AD用户组。在C#中很容易做到,但我不知道如何在JAVA中做到这一点。样本代码将是伟大的。在c#中,我会将安全组放入App.Config的App settings中,然后我可以获取当前登录用户的Windows标识,然后遍历用户所属的所有组并与所需的组匹配。如果您只关心当前登录的Windows用户(即,您的java

我知道这一定是一个非常简单的问题,但我对java是新手,很难得到我需要的确切代码。我需要能够做的是从Windows获取当前登录的用户名,并检查该用户是否属于需要在某些配置文件中定义的特定AD用户组。在C#中很容易做到,但我不知道如何在JAVA中做到这一点。样本代码将是伟大的。在c#中,我会将安全组放入App.Config的App settings中,然后我可以获取当前登录用户的Windows标识,然后遍历用户所属的所有组并与所需的组匹配。如果您只关心当前登录的Windows用户(即,您的java程序将在Windows上运行),并且不介意使用,那么我需要在java中执行完全相同的操作,您可以使用
platform.jar
中提供的函数来获取用户所属的组

例如:

import com.sun.jna.platform.win32.Advapi32Util;

for (Advapi32Util.Account account : Advapi32Util.getCurrentUserGroups()) {
    System.out.println(account.fqn);
}
这还利用了这样一个事实,即当用户登录时,Windows会缓存所有组(包括包含用户所属的其他组的组)中的用户成员身份


这里的需求似乎有点不具体,这开始转向可能不太适合这样做的领域,但我还是要尝试一下

最终,系统的运行位置决定了安装的难度。如果您要在连接到要进行身份验证的同一域的基于Windows的服务器上运行,那么您应该看看,它提供了一个servlet,一个Spring安全过滤器,JAAS插件和其他几种实现Windows集成身份验证的方法,使用本机Windows方法加载Windows标识和关联的Active Directory组。这将为您提供与在.NET framework应用程序中使用IIS和WIA最相似的体验。缺点是服务器需要在Windows系统上运行

不幸的是,在非Windows环境中运行需要更多的设置和配置。最集成的解决方案可能是Spring Security,它能够提供SPNEGO(Windows集成身份验证)。上面的链接提供了有关启动和运行Kerberos筛选器所需的详细信息(我相信它们仍然是最新的)。要访问组信息,您需要更改示例
security.xml
文件中的
userDetailsService
值。这里最简单的方法是提供一个适当配置的对象。我对Spring并没有太多经验,但它的配置似乎是这样的(缺少
contextSource


这将为您提供一个Kerberos身份验证用户及其关联组

如果Spring安全性不可接受,您可以尝试使用和来运行您自己的版本,但是显示一个这样的示例基本上需要编写一个程序


我希望这有帮助。一旦你决定了一种方法,可能适合解决更具体的问题,因为这样可以键入问题。

你可以得到所有没有JNA的小组,如下所示:

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

显然,这只适用于Windows,甚至在Windows上也不鼓励使用com.sun.*包。有关结果的解释,请参阅。

这可以通过Java SE API完成,而无需直接使用com.sun.*包。使用(javax.security.auth.*和javax.security.auth.login.*)访问此信息。使用以下条目创建一个:

sampleApp {
    com.sun.security.auth.module.NTLoginModule required debug=false;
};
将该条目另存为
sampleapp\u jaas.config
。接下来设置system属性,以便Java查找配置文件

-Djava.security.auth.login.config==sampleapp_jaas.config
请注意,双等于具有特殊含义。有关加载顺序的详细信息,请参见

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

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。

“我发现很难获得所需的准确代码。”不幸的是,这绝非巧合:Java与Windows开发平台的集成与C#的集成水平不可匹敌。上一次我需要做类似的事情时,我不得不使用开放LDAP(包括调试Novell代码中的并发问题)跳过各种障碍。非常感谢。我会试试看。这个com.sun.jna.platform.win32.Advapi32Util包是否已经包含在Java标准安装中,或者我是否必须以某种方式安装它。我是java新手,所以我不知道。另外,它在非windows机器上会如何运行?@fenix2222:标准java包中不包括它。它是JNA的一部分(我在上面链接到)。这在非Windows机器上根本不起作用,因为它使用Win32 API实际执行查找(因此我在回答的开头给出了警告)。如果您能更清楚地了解您的要求,我很乐意提供帮助。如果您需要在非Windows环境下工作的东西,您可以尝试(通过上的评论找到)好的,我们的应用程序允许不同类型的身份验证:用户名/密码、OpenAuth和Active Directory。所以,如果在配置文件中的应用程序被配置为具有AD身份验证,并且指定了安全组,那么我希望能够自动检查登录的用户(无需询问密码),并检查他是否属于指定的组。我正在使用ApacheDirectoryStudio为测试构建我的广告。我知道我应该能够使用SpringLDAP,但是网络上的所有示例都显示了用户必须提供密码的身份验证,我不希望这样。请帮忙
LoginContext l = new LoginContext("sampleApp");
l.login();
try {
    Subject s = l.getSubject();
    for (Principal p : s.getPrincipals()) {
        System.out.println(p);
    }
} finally {
    l.logout();
}