您想做一些称为 SSO(单点登录)的事情:用户在某处登录(在您的情况下是他的 Windows 计算机)并且您希望使用此(已经完成的)登录来验证用户身份。这是一个非常常见的用例,并且有不同的方法可以做到这一点。但是,最大的问题始终是您如何信任这些第三方系统。这就是麻烦的开始。
由于您的问题不是很清楚,我假设您有一个在 Windows Server 上运行的 Java Glassfish 服务器和一个 Java 客户端(因为您要求提供 Java 代码)。因此 Java 服务器必须验证 Java 客户端的用户是谁。并且服务器必须信任这些信息。
使用System.getProperty("user.name"); 不是一个好主意,因为任何人都可以更改它。您可以使用java -Duser.name=Joe <your_program> 启动您的Java 程序,就是这样。
但由于您使用的是 Windows,因此您可以使用 Windows 来帮助您。如果您的客户端和服务器都在同一个域中,则它们将针对同一系统进行身份验证。您可以向该系统询问用户身份。通常公司的机器在同一个域中。
为此,有一个名为 Waffle 的工具。它在同一域中的计算机之间执行安全的 Windows 身份验证。如果您的客户端和服务器在同一个域中,那么执行 SSO(单点登录)是一种简单的方法。你可以在 GitHub 上找到它:http://dblock.github.io/waffle/
这是几个月前我自己的一个问题中的一个简单示例(请参阅here):
// client credentials handle
IWindowsCredentialsHandle credentials= WindowsCredentialsHandleImpl.getCurrent("Negotiate");
credentials.initialize();
// initial client security context
WindowsSecurityContextImpl clientContext = new WindowsSecurityContextImpl();
clientContext.setPrincipalName(Advapi32Util.getUserName());
clientContext.setCredentialsHandle(credentials.getHandle());
clientContext.setSecurityPackage(securityPackage);
clientContext.initialize();
// accept on the server
WindowsAuthProviderImpl provider = new WindowsAuthProviderImpl();
IWindowsSecurityContext serverContext = null;
do {
if (serverContext != null) {
// initialize on the client
SecBufferDesc continueToken = new SecBufferDesc(Sspi.SECBUFFER_TOKEN, serverContext.getToken());
clientContext.initialize(clientContext.getHandle(), continueToken);
}
// accept the token on the server
serverContext = provider.acceptSecurityToken(clientContext.getToken(), "Negotiate");
} while (clientContext.getContinue() || serverContext.getContinue());
System.out.println(serverContext.getIdentity().getFqn());
for (IWindowsAccount group : serverContext.getIdentity().getGroups())
System.out.println(" " + group.getFqn());
您也可以将 Waffle 用于网站。但是,我没有这样做,也无法向您解释在这种情况下该怎么做。
还有一个重要的评论:我觉得你有点困惑。如果您在服务器上执行request.getRemoteHost(),您会尝试获取发送请求的客户端的身份(顺便说一下,它不安全,客户端可以发送任何内容)。但是,如果您在服务器上执行System.getProperty("user.name"),您会尝试获取服务器本身的名称。请注意您在哪里(在客户端或服务器上)以及您想要什么。并确保您是否可以信任此信息。安全性很困难。