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