Subscrio
面向 .NET 和 TypeScript 开发者的开源权限引擎(Entitlement Engine)
Subscrio 是一款面向 .NET 和 TypeScript 开发者的开源权限引擎(Entitlement Engine),帮助开发者在自己的数据库中管理「用户可以访问哪些功能」的业务逻辑。它不是支付系统,不是用户授权系统,也不是特性开关,而是一个将商业合同、订阅计划、客户定制权限转化为代码可查询结果的中间层。
项目简介
在实际的 SaaS 产品中,商业逻辑的复杂性远超「免费版 vs 付费版」这样简单的二元判断。一个企业客户可能购买了「高级分析」套餐,但同时要求将席位上限从默认的 25 人提升到 40 人;另一个客户可能同时订阅了两个不同的计划,系统需要叠加判断这两个订阅各自授予了什么权限。Subscrio 的设计目标就是让开发者在代码中用一行稳定的关键字查询(如 seat-limit),而把套餐定义、客户定制、叠加规则全部集中在 Subscrio 的数据模型中管理。
核心功能
- 产品与套餐定义 — 在数据库中创建 Product(产品)、Feature(功能项)、Plan(套餐),定义每个套餐包含哪些功能、功能的具体值(开关型、数字型、文本型)。
- 客户与订阅管理 — 创建 Customer(客户)和 Subscription(订阅)记录,跟踪订阅的生命周期状态(生效中、已取消、已过期)。
- 功能查询 API — 应用程序在任何需要判断权限的地方调用 featureChecker.getValueForCustomer(),Subscrio 按「客户定制覆盖 → 套餐定义 → 功能默认值」的优先级返回最终结果。
- 客户级权限覆盖 — 支持为单个订阅设置 Feature Override,临时或永久替换套餐中的默认值,用于谈判客户特殊条款、促销期临时解锁等场景。
- 功能值类型支持 — 同时支持布尔型(是否允许访问)、数字型(如席位上限、人数限制)和文本型(如套餐名称、配置值)。
- 多订阅叠加 — 一个客户可以拥有多个订阅,Subscrio 根据订阅状态和优先级规则计算最终权限。
- 官方扩展生态 — 提供审计日志(Audit Log)和 Stripe 支付集成两个官方扩展,支持开箱即用的日志记录和支付事件驱动订阅更新。
- 可选管理后台 — MIT 开源引擎免费使用,独立出售的 Web Admin 提供图形化管理界面和 REST API,方便运营人员管理客户、套餐和订阅,无需直接操作数据库。
技术实现
Subscrio 包含两套主要实现:TypeScript 版(npm 包 subscrio,依赖 PostgreSQL)和 .NET 版(NuGet 包 Subscrio.Core,支持 PostgreSQL 和 SQL Server)。两个实现共享相同的概念数据模型,但 API 风格和数据访问层完全贴合各自生态(TypeScript 使用 async/await 和 Typed API,.NET 使用 C# 异步编程和依赖注入)。Rust 实现正在规划中,尚未发布。
数据模型层面,核心实体包括:Product(产品分组)、Feature(功能定义,含键名、值类型、默认值)、Plan(套餐,分配各功能值)、Billing Cycle(计费周期)、Customer(客户)、Subscription(订阅,连接客户与套餐,含生命周期状态)、Feature Override(客户定制覆盖)。应用程序通过稳定字符串键(如 analytics-seat-limit)而非数据库 ID 来引用功能,确保业务层与存储层解耦。
数据库方面,订阅和套餐数据完全存储在你自己的数据库中,不依赖任何第三方托管服务,Entitlement 解析逻辑在你的应用进程内执行,无需额外的微服务调用。
快速上手
- 安装依赖。 TypeScript 项目运行 npm install subscrio,.NET 项目通过 dotnet add package Subscrio.Core 添加包。
- 初始化数据库。 按照对应语言仓库的 README 说明执行数据库迁移脚本,创建 subscrio 相关的表结构。
- 配置套餐数据。 通过管理后台或配置同步功能(config sync)定义产品、功能项和套餐,或直接在代码中调用 API 创建。
- 在业务代码中查询。 注入 FeatureChecker 服务,调用 getValueForCustomer 方法,传入租户标识、产品标识、功能键名和默认值,获取该客户当前的实际权限值。
- 集成可选扩展。 如需审计能力,安装 subscrio-audit-log(TypeScript)或 Subscrio.AuditLog(.NET);如需 Stripe 支付集成,安装 subscrio-payments 或 Subscrio.Payments。
适用人群
- SaaS 产品后端开发者:需要精细化管理不同客户的功能权限、席位限制、套餐叠加逻辑。
- 平台类产品架构师:产品需要支持多租户、多套餐、多订阅组合的商业模型,且希望将权限判断逻辑从业务代码中剥离。
- 集成多支付渠道的团队:已经使用 Stripe 收款的团队,希望将付款事件自动转化为订阅状态的更新,减少人工操作。
- 需要透明权限系统的企业:希望在数据库中清晰记录每个客户拥有的具体权限,而不是散落在业务代码的 if-else 条件分支中。
开发者备注
Subscrio 由独立开发者 Jasen Fici 创建并维护,采用 MIT 许可证开源。代码库分为多个仓库(主仓库 + TypeScript 实现仓库 + .NET 实现仓库 + 扩展仓库),本地开发时需将相关仓库克隆到同一工作区根目录以解析文件依赖。产品尚未发布 1.0 版本,API 在不同版本间可能有变化,但已在多个商业产品中实际使用。
官网:https://subscrio.com 文档:https://docs.subscrio.com GitHub:https://github.com/subscrio/subscrio
评论与建议
登录 后参与评论或提建议