为了账号安全,请及时绑定邮箱和手机立即绑定

Spring Boot 1 数据库多数据库用户

Spring Boot 1 数据库多数据库用户

慕无忌1623718 2024-01-05 16:44:39
我目前正在构建一个访问数据库的restful API(使用Spring Boot)。该应用程序最终将托管在服务器上。我想做的事:配置数据库有多用户,并为不同的表分配不同的权限根据调用的端点,使用特定用户在该函数中执行该查询我该如何配置上述应用程序?到目前为止我找到的答案涉及配置多个数据源,但对于上述应用程序,只有一个数据源,但有多个用户。我已阅读以下链接,但仍在尝试理解它https://kimrudolph.de/blog/spring-datasource-routing我是否使用相同的 URL(本例中为 jdbcURL)配置多个数据源,并为每个角色配置多组用户名和密码?谢谢你!
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

我的意思是,你已经找到了完成这项任务的最佳方法AbstractRoutingDataSource。如果您有固定数量的用户,那么您可以使用以下方法的最简单方法:


public final class RoutingDataSource extends AbstractRoutingDataSource {

    @Override

    protected Object determineCurrentLookupKey() {

        return UserContextHolder.getUserName() + "DataSource";

    }

}

以及配置:


@Bean

@Qualifier("user1DataSource")

public DataSource userOneDataSource() {

    return DataSourceBuilder.create()

            .username("user1")

            .password("pass")

             ...

             .build();

}


@Bean

@Qualifier("user2DataSource")

public DataSource userOneDataSource() {

    return DataSourceBuilder.create()

            .username("user2")

             ...

             .build();

}


@Bean

@Primary

public RoutingDataSource dataSource(Map<String, DataSource> datasources) {

    return new RoutingDataSource().dataSource(datasources);

 }

如果您需要在运行时添加用户和数据源,您可以使用如下内容:


public final class RoutingDataSource extends AbstractRoutingDataSource {

    private final ConcurrentHashMap<String, DataSource> dynamicDataSources = new ConcurrentHashMap<>();


    @Override

    protected Object determineCurrentLookupKey() {

        return UserContextHolder.getUserName() + "_datasource";

    }


    @Override

    protected DataSource determineTargetDataSource() {

        String currentLookupKey = this.determineCurrentLookupKey().toString();

        String userName = UserContextHolder.getUserName();

        String password = UserContextHolder.getPassword();


        return this.dynamicDataSources.computeIfAbsent(currentLookupKey, (key) -> DataSourceBuilder.create()

                .driverClassName("your.driver.class")

                .url("jdbc:same:url/here")

                .username(userName)

                .password(password)

                .build());

    }

}


查看完整回答
反对 回复 2024-01-05
  • 1 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信