我正在尝试创建一个具有供员工使用的后端的SAAS电子商务工具,该工具还允许客户在前端进行帐户和结帐。我正在努力设计该方法,以便使公司,帐户所有者,员工和客户都与每个公司隔离,同时还要根据角色对其进行适当的限制。
据我到目前为止所读的内容,大多数Rails解决方案都使用带有子域(例如Apartment gem)的多租户模式来隔离帐户。但是,让您的网站使用一个大型应用程序和数据库似乎更简单。例如,Basecamp最近使用Basecamp3切换到此方法。较新的应用似乎是通过这种方式构建的。
并且,管理功能和客户帐户/前端商店应该是完全独立的应用程序,还是可以使用“ majestic monolith”来实现?一个大的应用程序和数据库虽然很大,但对我来说似乎更简单。
我发现this blog post解释了如何使用Pundit做类似的事情,但是我仍然很难理解如何与帐户所有者,员工和客户一起使用在同一应用中。
这是我的应用程序的基本需求:
一个很好的类比是Shopify的管理区域和客户帐户当前如何用于商店所有者,但是与Shopify不同,它不需要使用子域。
Company
has_many :users, dependent: :destroy
has_many :products, dependent: :destroy
User
belongs_to :company
Product
belongs_to :company
对于如何处理不同的用户角色以及“工作人员邀请”和“客户”注册的位置可能适合注册流程,我有点模糊。
这种方法行得通吗?
是否有更好的方法来设计我所缺少的这种类型的应用程序?我在正确的轨道上吗?我没有建立类似这样的经验,因此任何线索都将非常有帮助。
似乎新的应用程序遵循这种类型的模式进行多租户而非子域访问。
答案 0 :(得分:2)
您以simple e-commerce site
开头,但您所提出的问题表明您正在寻找更复杂的东西:)您的方向正确。
acts_as_tenant宝石值得一看。我们现在使用它,它有助于确保所有查询的范围都适当。
如果您需要扮演角色,我也会查看并评估rolify(但也不要排除用户上的布尔标志)。
我不排除设计,但许可很受欢迎。
根据工作量的不同,使用子域可能是未实现的工作,除非您出于虚荣的目的实际使用子域(my.example.com与example.com/my),否则可以进行多租户。
如果他们的访问权限千差万别,我会考虑为不同的角色使用单独的控制器和命名空间;您还可以使用Pundit将它们组合为单个控制器(但这可能很笨拙)。您仍然需要使用Pundit,但是,Pundit可以执行诸如确定用户应查看的记录范围之类的事情。
您走在正确的道路上并提出了正确的问题,但是所有这些问题的答案将取决于其他问题(您现在可能甚至无法回答)。
我有一个项目正在按照您的指示进行(专为限制数据,acts_as_tenant为孤岛事务),但是随着项目的发展,出现了某些模式,这些模式导致我走了一条不同的道路。例如,命名空间管理员,而不是在同一个控制器内进行管理员检查;因为如果您重写API,最终将试图使同一个终结点做不同的事情,并且将命名空间后面的两个终结点分开并记录我的实际行为会更清洁。