对于设计为作为 SaaS 运行的应用程序,我认为这是一个非常基本的安全问题。下图表示实体之间的关系:
基本上,公司的用户创建了公司的每个其他用户都应该有权访问的项目。问题是如何在 Symfony2 中最好地解决这个问题。使用 ACL 似乎有点矫枉过正。
此外,我见过的大多数示例似乎都处理了控制器操作中的安全措施,这对我来说似乎很奇怪。我希望控制器与在内部处理安全性和权限的存储库进行交互。
对此的最佳做法是什么?
对于设计为作为 SaaS 运行的应用程序,我认为这是一个非常基本的安全问题。下图表示实体之间的关系:
基本上,公司的用户创建了公司的每个其他用户都应该有权访问的项目。问题是如何在 Symfony2 中最好地解决这个问题。使用 ACL 似乎有点矫枉过正。
此外,我见过的大多数示例似乎都处理了控制器操作中的安全措施,这对我来说似乎很奇怪。我希望控制器与在内部处理安全性和权限的存储库进行交互。
对此的最佳做法是什么?
在我看来,您的架构显示了解决方案。
我能想到的最简单的编码方案是:
My user is logged in
Get the user's company
Paginate all items attached to this company
您将没有 ACE 系统,但可以根据您的问题完成工作。
如果你想要一层额外的灵活性,我会在和UserGroup
中间添加实体。将与through和相同的事情有关。该实体可以有一个额外的列,该列以 JSON 编码的字符串保存 ACE 数据,这样每当您获得该组时,您就可以直接访问该组的 ACE。Company
User
Item
Item
Company
UserGroup
User
UserGroup
我对 ACL/ACE 的总体了解是,您必须花费适当的时间来规划您的集成,否则将变得非常难以维护。
要回答您的最后一个问题,ACL 没有任何最佳实践。Symfony2 有一个非常通用的 ACL 系统,它可能无法很好地扩展,但它可以满足大多数需求(如果不是全部)。我发现 Symfony2 ACL/ACE 系统很棒,但性能远非很好。
如果你有机会,你可以用缓存层包裹 Symfony ACL/ACE 系统,这将是理想的。但是,如果您的主机不允许您安装 Memcached 或 Redis 等解决方案,则您不能使用此解决方案。