我使用Tomcat7和SQL Server 2012。
我在SQL Server上运行了两个数据库,一个名为mydb1
,一个名为mydb2
。两个数据库几乎完全相同,但后者用于测试。
以下是web.xml
连接字符串
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/mydb1" type="javax.sql.DataSource" auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" initialSize="30"
maxActive="100"
url="jdbc:sqlserver://localhost:1433;database=mydb1;integratedSecurity=true;"
/>
<Resource name="jdbc/mydb2" type="javax.sql.DataSource" auth="Container"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver" initialSize="30"
maxActive="100"
url="jdbc:sqlserver://localhost:1433;database=mydb2;integratedSecurity=true;"
/>
由于我正在使用integratedSecurity进行连接,有什么方法可以限制第一个连接查看第二个数据库,反之亦然。
换句话说:当连接第一个连接时,我是否可以阻止代码SELECT * from mydb2.USERS
运行。同样,当连接第二个连接时,我是否可以阻止代码SELECT * from mydb1.USERS
运行。
答案 0 :(得分:1)
安全:不可以。您使用SSPI进行身份验证的唯一方法(即“Windows身份验证”)是连接过程的标识。如果两个连接从同一进程连接,那么它们是无法区分的。如果它们无法区分,则不能使用GRANT / DENY / REVOKE。
如果您正在寻找不安全的东西(例如,阻止意外使用错误的数据库),那么您可以依赖APP_NAME()
。强调不安全,app_name只是连接字符串中的一个设置,可以被任何人欺骗。
共享测试和生产数据库主机(将运行测试影响生产结果时间?)是不寻常的,而共享测试和生产客户端(您的Tomcat)更是如此。