我一直致力于为一家公司提供网络应用程序,帮助他们报价,管理库存和运行工作。我们相信该应用程序对行业中的其他公司有用,但我无法推出应用程序的单独实例,因此我们将其设为多用户(或多公司可能是一个更好的术语,如每家公司都有多个用户)。
它是用Codeigniter构建的(希望我已经在Rails中完成了它,但现在已经太晚了),而且我试图遵循瘦瘦的控制器胖模型方法。我只是想确保我正确地执行授权方面的事情。当用户登录时,我将companyID与userID一起存储在会话中。我认为用户交互的每个表都应该有一个额外的companyID
字段(通过关系间接访问的表可能也不需要存储companyID,但告诉我,如果我错了)。检索数据似乎非常简单,只需在AR中添加一个where子句即可将公司ID添加到选择中,例如$this->db->where('companyID', $companyID)
。我很好。
然而,我想知道的是如何确保用户只能修改他们自己公司内的数据(如果他们发送说明,删除请求到随机quoteID,使用firebug或类似工具)。我想到的一种方法是将上面的where where子句添加到模型中的每个更新和删除方法中。这在技术上可行,但我只是想知道这是否是正确的方法,或者是否有任何其他想法。
另一种选择是在修改之前检查用户的公司是否拥有该记录,但这似乎是数据库请求的双重增加,我真的不知道这样做是否有任何好处
我很惊讶我找不到这个问题的答案,我一定在寻找错误的术语:p。但我很感激这个主题的任何答案。
提前致谢,
基督教
答案 0 :(得分:1)
我会说你正确的做法。将所有项目保存在同一个表中将允许您运行全局统计信息以及本地化统计信息 - 所以我认为这是更好的方法。
我还要说,最好将您提到的where
子句添加到每个查询中(无论是get
,update
还是delete
。我不确定你是否想要手动进入并为你的所有查询执行此操作。我建议你在模型中覆盖这些方法以添加相关的where
子句。这样,当你打电话给{ {1}},您将自动获得添加到查询中的$this->model->get()
子句。
答案 1 :(得分:1)
从外观上看,这可能是一个更加API类型的系统(否则这只是一个普通的用户身份验证系统)。
简单身份验证
无论如何,我能看到API的最佳选择是有两个表,companies
和users
companies
表格中有companyID
和password
。在users
表中将每个用户链接到公司。
然后,当用户发出请求时,他们会通过companyID
和password
发送每个请求。
<强>的OAuth 强>
下一个选项,稍微难以实现,并且意味着另一端还必须设置Oauth身份验证是oauth。
但是,在我看来,整体使用起来要好得多,并且更加安全。
答案 2 :(得分:0)
一种方法是使用表格前缀。但是,如果你已经有很多表,重复它们显然会迅速增加数据库的大小。如果你没有很多表,那就应该扩展。您可以根据用户凭据设置前缀。请参阅此页面的前缀部分:http://codeigniter.com/user_guide/database/queries.html了解有关使用它们的更多信息。
另一种选择是不推出应用程序的单独实例,而是使用单独的数据库。以下是关于CI论坛讨论多个数据库的帖子:http://codeigniter.com/forums/viewthread/145901/这里您可以再次根据用户凭据选择合适的数据库。
我看到的唯一其他选项是您建议在指定所有权的数据中添加标识符的选项。这应该有效,但似乎有点吓人。