好用于单表继承?

时间:2009-11-01 14:44:11

标签: ruby-on-rails

我需要一个用户和一个联系人模型,两者都有一些共同的属性,如名字,姓氏,性别等。因此,创建模型个体并让用户和联系人继承该模型似乎是合理的。

class Individual  < ActiveRecord::Base
end

class User < Individual
end

class Contact < Individual
end

我的问题是,通过上述设置,我可以打开哪种类型的安全问题?我正在使用authlogic,它的所有必填字段都在个人表中。上面的方法看起来很容易,但是我担心我可能会遇到不可预见的安全问题,任何想法?为了清楚起见,用户可以登录,用户将有很多联系人。

2 个答案:

答案 0 :(得分:1)

从概念上讲,我不会混淆它们。每个模型的潜在意图/功能大不相同,因此它们看起来形状相似的事实是红鲱鱼。

可能你遇到了一个问题,有人可能想办法用联系人进行身份验证,虽然看起来不太可能,因为你不太可能为联系人分配用户名,或秘密哈希的东西。但是如果AuthLogic中存在一个错误,或者有人试图破解你的设置并且你不打算防止注入攻击,那么它是可能的。

此外,如果您的应用增长很多,还有性能原因不能这样做。基本上,我认为让这两个模型出于相当肤浅的原因依赖同一个表是一个糟糕的设计。

答案 1 :(得分:1)

使用STI无法解决任何新的安全问题,因为它们是正交的。

但是,STI可能会扰乱您的DBA,因为您将在该表中包含空字段。 (存在于一个子类模型中而不存在于另一个模型中的属性)

从设计角度来看,通过建立这样的模型关系,您实现了什么?如果用户和联系人之间的唯一区别是用户可以登录并且可以拥有多个联系人,那么您可以只拥有一个可以拥有多个联系人(映射到个人)并且可能具有登录凭据的个人

请记住,许多人可以共享联系人,其中规定了has_and_belongs_to_many或has_many:通过

HTH