我目前正在研究如何使用Windows身份验证而不是SQL Server身份验证从我的Java EE Web应用程序连接到SQL Server数据库.我从Tomcat 6.0运行此应用程序,并使用Microsoft JDBC驱动程序.我的连接属性文件如下所示:
dbDriver = com.microsoft.sqlserver.jdbc.SQLServerDriver dbUser = user dbPass = password dbServer = localhost:1433;databaseName=testDb dbUrl = jdbc:sqlserver://localhost:1433
使用SQL Server身份验证时,以这种方式连接到SQL Server数据库时没有任何问题.
有什么方法可以检索用户的Windows身份验证的凭据并使用该身份验证的SQL Server?
更新:我知道在ASP.net中有一种方法来设置Windows身份验证以访问webapp,这正是我正在寻找的,除了我想将该令牌传递给SQL Server以访问数据库.
我不认为可以将用户凭据从浏览器推送到数据库(这是否有意义?我认为不是)
但是,如果要使用运行Tomcat的用户的凭据连接到SQL Server,则可以使用Microsoft的JDBC驱动程序.只需像这样构建JDBC URL:
jdbc:sqlserver://localhost;integratedSecurity=true;
并将相应的DLL复制到Tomcat的bin目录(随驱动程序提供的sqljdbc_auth.dll)
MSDN>使用JDBC驱动程序连接到SQL Server>构建连接URL
看着
http://jtds.sourceforge.net/faq.html#driverImplementation
jTDS使用的URL格式是什么?
jTDS的URL格式为:
jdbc:jtds::// [: ][/ ][; = [;...]]
...域名指定Windows域进行身份验证.如果提供目前以及用户名和密码,JTDS使用Windows(NTLM)身份验证,而不是通常的SQL Server身份验证(即所提供的用户名和密码是域用户和密码).这允许非Windows客户端登录到仅配置为接受Windows身份验证的服务器.
如果域参数存在但没有提供用户名和密码,则jTDS使用其本机Single-Sign-On库并使用记录的Windows用户凭据登录(为此工作,显然需要在Windows上,登录到一个域,并且还安装了SSO库 - 请参阅README.SSO中的分发,了解如何执行此操作).
这实际上对我有用:
根据jtdsd发行版附带的README.SSO:
为了使单点登录正常工作,jTDS必须能够加载本机SPPI库ntlmauth.dll
.将此DLL放在系统路径中的任何位置(由PATH
系统变量定义),您就完成了所有设置.
我把它放在我的jre/bin文件夹中
我配置了一个专用于sql server实例(2302)的端口,以减少对实例名称的需求 - 就像我做的那样.lportal是我的数据库名称.
jdbc.default.url=jdbc:jtds:sqlserver://192.168.0.147:2302/lportal;useNTLMv2=true;domain=mydomain.local
除非你有一些非常令人信服的理由,否则我建议放弃MS JDBC驱动程序.
相反,使用jtds jdbc驱动程序.阅读jtds发行版中的README.SSO文件,了解如何配置单点登录(本机身份验证)以及将本机DLL放在何处以确保它可以由JVM加载.