java - 多个数据源对一个数据库具有不同的权限

标签 java spring jdbc dao jdbctemplate

对同一数据库使用具有不同用户权限的单独数据源是否是一种好的做法?看起来,在一个应用程序(甚至一个 DAO 类)中拥有 2 个独立的数据源会增加更多的安全性,因为非管理员用户永远无法修改数据。

场景

具有 3 种用户类型的 Web 应用程序:访客、用户、管理员。前两者只需要读取访问权限。管理员还需要 WRITE 权限。整个应用程序应该使用一个具有读写访问权限的数据源,还是将其拆分为 2 个不同的数据源会更好?

Spring 应用程序,由 WildFly 管理的 Autowiring 数据源。示例:

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
    }
}

上述解决方案有哪些缺点?

最佳答案

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

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

用户只能在您定义的用例中与您的数据源交互。因此,您已经根据每个用例可以执行的操作以及哪些用户有权访问每个用例来限制数据源访问。

此外,不要误以为允许用户仅读取数据就可以使您的应用程序更加安全。根据您拥有的数据,赋予用户读取数据的能力可能与允许用户写入数据一样危险。

关于java - 多个数据源对一个数据库具有不同的权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34179588/

相关文章:

spring - Spring 框架中的 CGLIB 是什么?

java - 尝试在 Spring 中将 Aspect 添加到 MongoTemplate 时出错

java - java jdbc 异常中结果集异常开始之前

java - 使用自动生成的主键提高数据库性能(或)避免数据库表的性能问题

java - 添加包语句时找不到或加载主类

java - 使用 Mockito isEmpty 的模拟列表始终返回 false,即使大小为 0

java - 数量太大

java - Android - 相机在某些设备的后置摄像头上提供颠倒的数据

Java Web 启动 : Company Database

java - Spring Security 'remember me' cookie 在第一个请求中不可用