对同一个数据库使用具有不同用户权限的单独数据源是一种好习惯吗?看起来在一个应用程序(甚至一个DAO类)中有两个独立的数据源会增加更多的安全性,因为非管理员用户永远无法修改数据。
方案
具有3种类型用户的Web应用程序:来宾,用户,管理员。前两个只需要READ访问权限。管理员还需要WRITE权限。整个应用程序是否应该使用一个具有READ-WRITE访问权限的dataSource,还是将它拆分为2个不同的dataSource?
Spring应用程序,由WildFly管理的自动装配的DataSource。例如:
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
}
}
上述解决方案有哪些缺点?
答案 0 :(得分:1)
不,除非您的应用程序允许用户直接键入要在服务器上执行的SQL,否则拥有单独的DataSource并没有多大意义。
将两个DataSource相互协调将只会给代码增加不必要的复杂性,并产生额外的资源开销。如果访客或用户生成需要存储在数据库中的记录,该怎么办?比如简单的密码更改或其他什么。他们是否需要将请求转发给管理员?
用户只能在您定义的用例中与您的数据源进行交互。因此,您将根据每个用例可以执行的操作以及哪些用户可以访问每个用例来限制DataSource访问。
此外,不要误以为允许用户只读取数据会使您的应用程序以任何方式安全。根据您拥有的数据,让用户读取数据的能力与允许用户写入数据一样危险。