【发布时间】:2015-12-09 13:05:58
【问题描述】:
对同一数据库使用具有不同用户权限的单独数据源是否是一种好习惯?似乎在一个应用程序(甚至一个 DAO 类)中拥有 2 个单独的数据源会增加更多的安全性,因为非管理员用户永远无法修改数据。
场景
具有 3 种用户类型的 Web 应用程序:访客、用户、管理员。前两者只需要 READ 权限。管理员还需要 WRITE 权限。整个应用程序应该使用一个具有 READ-WRITE 访问权限的数据源还是将其拆分为 2 个不同的数据源更好?
Spring 应用程序,由 WildFly 管理的自动装配数据源。示例:
Servlet-context.xml
<jee:jndi-lookup id="dataSourceR" jndi-name="java:jboss/datasources/SomeAppUserDS" />
<jee:jndi-lookup id="dataSourceW" jndi-name="java:jboss/datasources/SomeAppAdminDS" />
<beans:bean id="SomeSharedDAO" class="com.example.SomeSharedDAO">
<beans:property name="dataSourceR" ref="dataSourceR"/>
<beans:property name="dataSourceW" ref="dataSourceW"/>
</beans:bean>
SomeSharedDAO
public class SomeSharedDAO {
private DataSource dataSourceR;
public void setDataSourceR(DataSource dataSourceR) {
this.dataSourceR = dataSourceR;
}
private DataSource dataSourceW;
public void setDataSourceW(DataSource dataSourceW) {
this.dataSourceW = dataSourceW;
}
//Some public method for all users
public List<Something> list() {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSourceR);
//...
//SQL select
}
//Some method for admin only
public void change(Something s) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSourceW);
//...
//SQL insert/update
}
}
上述方案有什么缺点?
【问题讨论】:
-
为什么会增加复杂性?恕我直言,除了在您的应用程序中增加复杂性和模糊用法之外,它没有给您任何东西。使用单个并保护不同类型的正确 url 操作。
-
@M.Deinum 只有额外的安全性。将从数据库中读取的方法与也可以写入的方法分开。以防将来某个时候有人忘记了参数化查询或犯了其他错误。这有点矫枉过正,不是吗?
-
我会说 YAGNI,因为你还有另一个问题,谁说每个人都在使用正确的数据源?此外,您不应该仅仅因为可以(创建一次)就创建
JdbcTemplates。当然,您可以拆分它们,但是恕我直言,这不仅使您的代码变得过于复杂,而且事务呢?你从一个读,写另一个,你需要一些协调,因为你现在有多个资源。如果您在读取时使用锁定并获得锁定怎么办,现在写入将由于多个连接而阻塞。所以它并不像你想象的那么简单。 -
@M.Deinum 我想你是对的,我需要听听这方面的一些利弊,我真的想不出很多优点。谢谢!
标签: java spring jdbc dao jdbctemplate