2011-11-07 160 views
1

我一直在为帮助他们进行报价,管理库存和运行作业的公司开发Web应用程序。我们相信该应用将对该行业的其他公司有所帮助,但我不希望推出单独的应用实例,因此我们让它成为多用户(或多公司可能是一个更好的术语,因为每家公司都有多个用户)。MVC多用户身份验证/安全

它建在Codeigniter中(希望我已经在Rails中完成了,现在已经太晚了),并且我试图遵循瘦控制器胖模型的方法。我只是想确保我正确地做好事情的授权方面。当用户登录时,我会将sessionID和userID一起存储在会话中。我在想,用户接口的每个表都应该有一个额外的companyID字段(通过关系间接访问的表可能不需要存储companyID,如果我错了,告诉我)。检索数据看起来非常简单,只需在AR中增加一个where子句即可将公司ID添加到select中,例如$this->db->where('companyID', $companyID)。我对此很好。

但是,我想知道的是如何确保用户只能修改自己公司内的数据(如果他们发送的话,使用萤火虫或类似工具发送删除请求到随机报价ID)。我想到的一种方法是在模型中的每个更新和删除方法中添加上面的where子句。这在技术上是可行的,但我只想知道这是否是正确的做法,或者是否有其他想法。

另一种选择是在修改之前检查用户的公司是否拥有该记录,但这看起来像是数据库请求的双重化,而且我不确定是否有任何好处办法。

我很惊讶,我找不到这个问题的答案,我必须寻找错误的条件:p。但我很感谢这个话题的任何答案。

由于提前,

基督教

回答

1

我想说你正在以这种正确的方式前进。将所有项目保留在同一个表格中将允许您运行全局统计以及本地化统计 - 所以我认为这是更好的方法。

我还要说,这将是最好的补充你提到的每个查询(不管它是一个getupdatedelete,但我不知道你想手动进去,做where条款对于您的所有查询,我建议您在模型中覆盖这些方法以添加相关的where子句。这样,当您拨打$this->model->get()时,将自动获得where->($companyID, $userID)子句添加到查询中。

0

一种方式做到这一点是与表前缀。但是,如果您已经有很多表,重复它们会显着增加数据库的大小。如果你没有很多表格,这应该缩放。您可以根据用户凭证设置前缀。请参阅本页面的前缀部分:http://codeigniter.com/user_guide/database/queries.html了解更多关于使用它们的信息。

另一种选择是不推出单独的应用程序实例,但使用单独的数据库。以下是CI论坛上讨论多个数据库的文章:http://codeigniter.com/forums/viewthread/145901/这里您可以再次根据用户凭据选择适当的数据库。

我看到的唯一的其他选项是您建议在指定所有权的数据中添加标识符的那个选项。这应该工作,但似乎有点可怕。

1

从外观看起来,这可能是一个更多的API类型系统(否则这只是一个普通的用户认证系统)。

简单认证
反正,我可以看到一个API的最好的办法是有两个表,companiesuserscompanies表有companyIDpassword。在users表中将每个用户链接到一个公司。

然后当用户提出请求时,他们通过companyIDpassword发送每个请求。

的OAuth
下一个选项,稍硬实现,并意味着另一端也必须设置OAuth认证是OAuth的。

但是,在我看来,整体使用更好,并且更安全一些。