我需要存储Windows用户名和凭据,以便稍后运行一些需要这些凭据的进程。
当我从用户收集这些作为输入时,我想验证凭据是否正确。 Java中的原生api是否可以帮助我验证Windows系统凭据?
我正在通过LoginContext
课,但看起来它只能用于SSO目的。
我收到的另一个建议是尝试启动一个需要这些凭据的过程,看看它是否有效。但这看起来并不恰当。
如果有人以前做过这件事,或者知道如何完成,请告诉我。
谢谢, PIYUSH
答案 0 :(得分:8)
凭据凭据,您指的是用户的实际密码?然后,您可以使用LDAP尝试连接到Windows Active Directory。请参阅相关问题:Windows password Authentication with LDAP
更精细的方法是使用本机Windows调用,可能通过JNA平台:http://jna.java.net/javadoc/platform/com/sun/jna/platform/win32/package-summary.html
有一个名为'华夫饼干'的项目将其包装在一个更有用的库中,参见例如https://github.com/dblock/waffle/blob/master/Source/JNA/waffle-jna/src/waffle/windows/auth/impl/WindowsAuthProviderImpl.java中的logonUser函数。这直接与win32 advapi32.dll进行了对话。
这也允许您为没有域的本地用户进行Windows身份验证。
编辑:来自OP的完整工作代码
import com.sun.jna.platform.win32.Advapi32;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinBase;
import com.sun.jna.platform.win32.WinNT.HANDLEByReference;
HANDLEByReference phUser = new HANDLEByReference()
if(! Advapi32.INSTANCE.LogonUser("administrator", InetAddress.getLocalHost().getHostName(),
"password", WinBase.LOGON32_LOGON_NETWORK, WinBase.LOGON32_PROVIDER_DEFAULT, phUser))
{
throw new LastErrorException(Kernel32.INSTANCE.GetLastError());
}