多租户设计

目录

一、多租户是什么?

二、多租户数据隔离方案

三、实现步骤

1.引入库

2.配置文件 META-INF/spring.factories

3.TenantConfiguration

4.TenantProperties

5.TenantHandler

6.TenantInterceptor

7.MybatisPlusProperties

8.MybatisAutoConfiguration

9.引用租户模块

总结


一、多租户是什么?

• 多租户技术是一种软件架构技术,是实现如何在多用户(一般是面向企业用户)的环境下共用相同的系统或程序组件,并且可确保各用户间数据的隔离性。

• 多租户技术可以实现多个租户之间共享系统实例,同时又可以实现租户的系统实例的个性化定制。

• 通过在多个租户之间的资源复用,有效节省开发应用的成本。在租户之间共享应用程序的单个实例,可以实现当应用程序升级时,所有租户可以同时升级。

二、多租户数据隔离方案

• 独立数据库

• 共享数据库,隔离数据架构

• 共享数据库,共享数据架构

 采用方案:共享数据库,共享数据架构(租户ID隔离)

三、实现步骤

1.引入库

<!--mybatis-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
</dependency>

<!--数据库-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!--dynamic-datasource-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
</dependency>

2.配置文件 META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    com.ronshi.common.tenant.config.TenantConfiguration

3.TenantConfiguration

@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore({MybatisAutoConfiguration.class})
@EnableConfigurationProperties({TenantProperties.class})
public class TenantConfiguration {

    @Bean
    @ConditionalOnMissingBean({TenantLineHandler.class})
    public TenantLineHandler tenantHandler(TenantProperties tenantProperties) {
        return new TenantHandler(tenantProperties);
    }

    @Bean
    @ConditionalOnMissingBean({TenantLineInnerInterceptor.class})
    public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantLineHandler tenantHandler, TenantProperties tenantProperties) {
        TenantInterceptor tenantInterceptor = new TenantInterceptor();
        tenantInterceptor.setTenantLineHandler(tenantHandler);
        tenantInterceptor.setTenantProperties(tenantProperties);
        return tenantInterceptor;
    }
}

4.TenantProperties

@Data
@ConfigurationProperties(prefix = "ronshi.tenant")
public class TenantProperties {
    private Boolean enhance;
    private String column;
    private List<String> excludeTables;
    private List<String> matchUrls;
    private List<String> excludeUrls;

    public TenantProperties() {
        this.enhance = Boolean.FALSE;
        this.column = "tenant_id";
        this.excludeTables = new ArrayList<>();
        this.matchUrls = new ArrayList<>();
        matchUrls.add("/**");
        this.excludeUrls = new ArrayList<>();
    }
}

5.TenantHandler

public class TenantHandler implements TenantLineHandler, SmartInitializingSingleton {
    private final TenantProperties tenantProperties;


    @Override
    public Expression getTenantId() {
        Long tenantId = TenantUtil.getTenantId();
        if (tenantId == null) {
            throw new RuntimeException("请设置租户ID");
        }
        return new LongValue(tenantId);
    }

    @Override
    public String getTenantIdColumn() {
        return this.tenantProperties.getColumn();
    }

    @Override
    public boolean ignoreTable(String tableName) {
        return this.tenantProperties.getExcludeTables().contains(tableName);
    }

    @Override
    public void afterSingletonsInstantiated() {
        // 实例化后执行
    }


    public TenantHandler(final TenantProperties tenantProperties) {
        this.tenantProperties = tenantProperties;
    }
}

6.TenantInterceptor

@Data
public class TenantInterceptor extends TenantLineInnerInterceptor {
    private TenantProperties tenantProperties;

}

7.MybatisPlusProperties

@ConfigurationProperties(prefix = "ronshi.mybatis-plus")
@Data
public class MybatisPlusProperties {
    private Boolean tenantMode = false;
}

8.MybatisAutoConfiguration

@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties({MybatisPlusProperties.class})
public class MybatisAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean({TenantLineHandler.class})
    public TenantLineHandler tenantLineHandler() {
        return new TenantLineHandler() {
            @Override
            public Expression getTenantId() {
                return new LongValue(0L);
            }

            @Override
            public boolean ignoreTable(String tableName) {
                return true;
            }
        };
    }

    @Bean
    @ConditionalOnMissingBean({TenantLineInnerInterceptor.class})
    public TenantLineInnerInterceptor tenantLineInnerInterceptor(TenantLineHandler tenantHandler) {
        return new TenantLineInnerInterceptor(tenantHandler);
    }


    /**
     * 插件主体
     *
     * @return MybatisPlusInterceptor
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(TenantLineInnerInterceptor tenantLineInnerInterceptor, MybatisPlusProperties mybatisPlusProperties) {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //判断是否为租户模式
        if (Boolean.TRUE.equals(mybatisPlusProperties.getTenantMode())) {
            interceptor.addInnerInterceptor(tenantLineInnerInterceptor);
        }
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

9.引用租户模块

<!--多租户数据隔离 模块-->
<dependency>
     <groupId>com.ronshi</groupId>
     <artifactId>tenant-starter</artifactId>
</dependency>
ronshi:
  mybatis-plus:
    tenant-mode: true
  tenant:
    exclude-tables:
      - tenant

总结

租户模块分包,可根据服务是否为多租户模式,来选择是否加载租户模块。租户字段名称和拦截的表名动态配置。采用了配置属性类、配置类、拦截类、处理类分离的模式,可以灵活扩展。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Node.js是一种非常流行的服务器端开发语言,它允许我们构建高性能、可扩展的应用程序。在许多应用程序中,我们需要实现多租户的权限设计,以确保每个租户只能访问他们自己的数据和资源。 多租户权限设计的主要目标是在一个应用程序中为多个租户提供安全、独立的环境。 在Node.js中,可以使用以下方法来实现多租户权限设计: 1. 身份验证和授权:首先,需要根据每个租户的身份进行身份验证。可以使用常见的身份验证策略,例如用户名/密码、令牌验证等。一旦租户被验证,就需要为他们分配相应的权限和角色,以控制他们能够访问的资源和操作。 2. 数据隔离:多租户环境中的一个重要考虑因素是数据隔离。每个租户应该只能访问和修改与他们相关的数据。可以通过在数据库中使用不同的租户标识符来实现数据隔离,例如将租户ID添加到每个表中的记录中。 3. 路由和中间件:在Node.js中,可以使用路由和中间件来实现多租户权限。可以根据租户的身份和角色,在路由中进行条件分支,并根据需要执行相应的操作。中间件可以用于验证和授权请求,以确保只有具有适当权限的租户可以访问特定的资源。 4. 错误处理:在多租户环境中,错误处理也是重要的一部分。当租户尝试访问他们没有权限的资源时,必须提供适当的错误提示,并拒绝访问请求。 通过以上方法,我们可以在Node.js中实现多租户的权限设计,以确保每个租户的数据和资源的安全性和独立性。这对于构建安全、可扩展的应用程序非常重要。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ronshi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值