我可以从 Java EE webapp 使用 Windows 身份验证连接到 SQL Server 吗?

Posted

技术标签:

【中文标题】我可以从 Java EE webapp 使用 Windows 身份验证连接到 SQL Server 吗?【英文标题】:Can I connect to SQL Server using Windows Authentication from Java EE webapp? 【发布时间】:2010-09-15 02:41:14 【问题描述】:

我目前正在研究如何使用 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 身份验证凭据并将 that 身份验证用于 SQL Server?

更新:我知道在 ASP.net 中有一种方法可以设置 Windows 身份验证以访问 web 应用程序,这正是我正在寻找的,除了我想传递那个令牌到 SQL Server 以访问数据库。

【问题讨论】:

【参考方案1】:

除非你有一些真正令人信服的理由不这样做,否则我建议放弃 MS JDBC 驱动程序。

改为使用jtds jdbc driver。阅读 jtds 发行版中的 README.SSO 文件,了解如何配置单点登录(本机身份验证)以及将本机 DLL 放置在何处以确保它可以被 JVM 加载。

【讨论】:

问题确实是在寻找 SSO(单点登录)。 @jim:如果您在 Linux 上拥有基于 Kerberos 的身份验证,那么您可以拥有 SSO,但我发现在 Linux 上使用它进行 MS SQL 身份验证的唯一方法是通过 DataDirect 驱动程序。跨度> 为什么首选 JTDS 驱动程序?我知道它不支持连接池,这对我来说是必不可少的。 这比它的价值更多,并且对性能有影响。当我们更换 jTDS 时,仅 Microsoft 的驱动程序就产生了大约 20% 的性能提升。在某些非常特殊的情况下,jTDS 表现更好,我们将其用于这些情况。这不是一个通用的解决方案,通常不值得付出努力。 多年前,微软忽略了他们的 Java 驱动程序,而 jTDS 泄露了信息。如今,微软在官方 Java 驱动程序上投入了更多的精力。我会将它们用于当前的应用程序。我认为现在没有使用 jTDS 的理由,但是我已经很长时间没有使用它们了,所以我没有当前的经验。【参考方案2】:

我不认为可以将用户凭据从浏览器推送到数据库(这有意义吗?我认为没有)

但是如果您想使用运行 Tomcat 的用户的凭据连接到 SQL Server,那么您可以使用 Microsoft 的 JDBC 驱动程序。 只需像这样构建您的 JDBC URL:

jdbc:sqlserver://localhost;integratedSecurity=true;

并将相应的DLL复制到Tomcat的bin目录下(驱动提供的sqljdbc_auth.dll)

MSDN > Connecting to SQL Server with the JDBC Driver > Building the Connection URL

【讨论】:

为什么将用户凭据从浏览器推送到数据库没有意义?我认为多跳身份验证正是 OP 在这里寻找的。鉴于我的回复晚了 3 年,但我想了解您的理由。【参考方案3】:

看看

http://jtds.sourceforge.net/faq.html#driverImplementation

jTDS 使用的 URL 格式是什么?

jTDS 的 URL 格式为:

jdbc:jtds:<server_type>://<server>[:<port>][/<database>][;<property>=<value>[;...]]

... 领域 指定要在其中进行身份验证的 Windows 域。如果存在并且提供了用户名和密码,jTDS 将使用 Windows (NTLM) 身份验证而不是通常的 SQL Server 身份验证(即,提供的用户和密码是域用户和密码)。这允许非 Windows 客户端登录到仅配置为接受 Windows 身份验证的服务器。

如果存在域参数但未提供用户名和密码,jTDS 将使用其本地单点登录库并使用已登录的 Windows 用户的凭据登录(为此,显然需要在 Windows ,登录到域,并且还安装了 SSO 库——请参阅发行版中的 README.SSO,了解如何执行此操作。

【讨论】:

【参考方案4】:

我在使用 Windows 身份验证连接到 MS SQL 2005 时遇到问题。在这个论坛和其他论坛的帮助下,我能够解决这个问题。这是我所做的:

    安装 JTDS 驱动程序 不要在 jdbc:jtds:://[:][/][;=[;...]] 字符串中使用“domain=”属性 在 Web 服务器计算机上的 c:\windows\system32 目录中安装 ntlmauth.dll(不需要注册 dll)。 将 Apache Tomcat 服务的登录身份更改为有权访问 SQL 数据库服务器的域用户(用户不必有权访问 dbo.master)。

我的环境: 在 Windows 2003 上托管带有 MS SQL 2005 后端的 Apache Tomcat 6 的 Windows XP 客户端

【讨论】:

【参考方案5】:

这实际上对我有用:

根据 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

【讨论】:

以上是关于我可以从 Java EE webapp 使用 Windows 身份验证连接到 SQL Server 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java EE - 获取上传文件的真实路径的最佳方式? [复制]

Java EE 6 - JSF 控制器

java EE

解决Eclipse EE部署web项目在Tomcat webapp目录下没有工程文件的问题

学习Flex和Java EE的最快方法? [关闭]

您如何管理 java webapps 中的嵌入式配置文件和库?