我正在开发一个Web应用程序,最好使用客户端凭据(Windows用户)连接到SQL Server。
这样做的原因是每个用户都要对数据库访问进行审核,最好是基于AD来避免多次登录,并使管理变得容易。
应用程序在Tomcat 7.0.57上运行并设置了SpnegoHttpFilter,我可以从请求中获取用户名和用户主体。我可以使用Tomcat的Window用户连接到SQL服务器。
但是如何使用客户端用户凭据连接到SQL Server(当然只是用户名不够用)?
是否会从DelegateServiceRequest帮助中获取委派的凭据(目前尚未设置)?我没有找到任何支持在Microsoft JDBC驱动程序中使用GSSCredential(一些搜索表明Progress DataDirect JDBC驱动程序支持使用GSSCredential但我还没有找到有关如何执行此操作的任何文档,我更愿意使用免费解决方案,如果有的话)。
我已经搜索了这个问题的答案,但到目前为止,我还没有找到任何有关如何进行的好线索,有什么想法吗?
注意:这是在公司环境中,这意味着所有用户都通过AD进行管理,包括访问数据库和Windows登录。
注2:以下解决方案似乎有效
连接字符串如下所示:
jdbc:sqlserver://<host>:<port>;databaseName=<bdname>;integratedSecurity=true;authenticationScheme=JavaKerberos;
创建连接时,代码如下所示:
DelegateServletRequest dsr = (DelegateServletRequest)HttpServletRequest();
GSSCredential cred = dsr.getDelegatedCredential();
try
{
Subject s = GSSUtil.createSubject(cred.getName(), cred);
return (Connection) Subject.doAs(s,
new PrivilegedExceptionAction<Object>()
{
@Override
public Object run() throws Exception
{
Connection c = null;
c = DriverManager.getConnection(url);
return c;
}
});
}
catch (PrivilegedActionException e)
{
throw new DAOException(e);
}
catch (GSSException e)
{
throw new DAOException(e);
}
答案 0 :(得分:3)
这不是最佳做法。在Web应用程序数据库中,连接不应取决于Web应用程序用户的登录。使用应用程序用户登录作为数据库登录会导致多个问题:
摘要是 - 使用应用程序用户凭据连接数据库是一个坏主意。
还有其他审核数据库访问的方法。大多数数据库允许您为此目的在数据库连接上设置某种会话信息。您可以在审计日志代码中访问该日志代码,以记录哪个应用程序用户对数据库执行了哪些操作。例如:
其他数据库应该有相同的东西。请谷歌。
答案 1 :(得分:1)
在阅读评论后,看起来@Rico对这种方法很顽固(这可能会在将来引起很多痛苦)。相信你知道你在做什么这是一种方式(也可能有其他方式)你如何&#34;可以&#34;做到这一点。如果您在阅读完整个故事后想要这样做,请随意执行:
javax.servlet.http.HttpSession
)中缓存凭据,以便每个请求都可以访问它。这有安全隐患。可以通过错误或设计攻击者向攻击者/黑客透露此缓存凭据。HttpServletRequest
。在请求对象上调用HttpServletRequest.getSession
方法以获取会话并从中检索凭据。使用检索的凭据建立数据库连接
从问题看来,您的应用程序中不存在以下情况。如果它们中任何一个存在,这就是你必须要做的事情:
HttpSession
中缓存的凭据建立新连接。这将是非常低效的,但这是你所讨论的。Duh ..你还觉得值得吗?