【问题标题】:Multiple datasources with different permissions to one database对一个数据库具有不同权限的多个数据源
【发布时间】: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


【解决方案1】:

不,除非您的应用程序允许用户直接键入要在服务器上执行的 SQL,否则单独的 DataSource 没有多大意义。

相互协调两个数据源只会给您的代码增加不必要的复杂性,并产生额外的资源开销。如果来宾或用户生成需要存储在数据库中的记录怎么办?比如简单的密码修改什么的。他们是否需要将请求转发给管理员?

用户只能在您定义的用例中与您的数据源交互。因此,您已经根据每个用例可以做什么以及哪些用户可以访问每个用例来限制 DataSource 访问。

此外,不要以为只允许用户读取数据就可以确保您的应用程序安全。根据您拥有的数据,让用户能够读取数据可能与允许用户写入数据一样危险。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 2011-12-30
    • 1970-01-01
    • 2010-11-25
    • 1970-01-01
    • 2022-01-08
    • 2016-09-10
    相关资源
    最近更新 更多