我希望我的桌面Java应用程序能够与Active Directory用户进行单点登录 . 分两步,我想:
-
确保特定用户已使用某些用户条目登录Windows .
-
从Active Directory中查看该用户的一些设置信息
使用Java: Programatic Way to Determine Current Windows User我可以获得当前Windows用户的名称,但我能依靠它吗?我觉得
System.getProperty("user.name")
会不够安全? (“user.name”似乎来自环境变量,所以我不能依赖它,我想?)
问题Authenticating against Active Directory with Java on Linux为我提供了给定名称传递的身份验证,但我想根据Windows登录进行身份验证?
对于Active Directory访问,LDAP可能是选择?
我不完全确定我是否提出了正确的问题,但希望有人有一些想法可以转发我 .
8 回答
只是为了其他人阅读此主题的好处,http://www.javaactivedirectory.com/?page_id=196有一个关于如何使用Windows / Active Directory进行单点登录的示例
在http://jcifs.samba.org/查看jCifs
除此之外,坚持使用LDAP(实际上,它应该是我的第一次尝试,但......)
将JAAS与LDAP LoginModule一起使用 . 这将允许您插入底层Java安全基础结构 .
当您需要使应用程序脱机或“调试”应用程序时,您可以轻松地将LDAP模块换出虚拟模块 . 这允许您继续测试“安全性”,而不依赖于Active Directory . 高度可测试,解耦,您可以在以后几乎没有悲伤的身份验证方案 .
Project Waffle具有在Windows上执行SSO的客户端和服务器端代码 . 它是基于JNA的,不需要本机库 .
这article from Sun,这open source library可能能够满足您的需求 .
它不受支持 . Java 6有改进,但还不够 .
Java有自己的GSS堆栈 . 问题是单点登录,您需要从操作系统(而不是Java堆栈)获取Kerberos票证 . 否则,用户必须第二次进行身份验证(无法实现单点登录的目的) .
看看http://java.sun.com/developer/technicalArticles/J2SE/security/ . 向下看"Access Native GSS-API",它讨论了一个新的系统属性sun.security.jgss.native,当设置为true时,Java会使用底层的OS GSS实现,从而可以访问操作系统级别的身份验证 . 完美!....除了它仅支持Solaris和Linux,而不支持Microsoft Windows .
但是,Java 6似乎有足够的支持充当从IE接收SPNEGO身份验证请求然后针对Active Directory对该用户进行身份验证的服务器 . 它只是桌面客户端支持仍然不完整 .
您是否考虑过使用JNA api(允许您轻松地对操作系统进行本机调用)?
您可以在http://msdn.microsoft.com/en-us/library/ms724432(VS.85).aspx调用win32 metod
GetCurrentUser
MSDN文档 . 它位于Advapi32.dll内 .如果需要,它还有一个unicode版本,GetCurrentUserW .
而你是对的 . 看起来环境变量似乎可以改变,因此可能会误导使用 .
我不确定32 / 64bit窗口对跨平台的影响 . 如果你需要代码中的解决方案,我相信我可以为它编写一些东西 .
但是,是的,只是一个想法:)
使用Spring Security可能会获得最大的灵活性 . 您可以将它与JAAS和LDAP身份验证一起使用 .