LDK
LDK

Reputation: 2575

Ok use for Single Table Inheritence?

I have the need for a user and a contacts model, both have common attributes like first name, last name, sex etc. It thus seemed reasonable to create a model individual and have user and contacts inherit from that model.

class Individual  < ActiveRecord::Base
end

class User < Individual
end

class Contact < Individual
end

My question is, what type of security problems would I open up by having the above setup? I'm using authlogic and all of its required fields are within the individuals table. The above method seems easy, and yet I'm worried I may open myself up to unforeseen security issues, any thoughts? Just to be clear a user can login and a user will have many contacts.

Upvotes: 0

Views: 105

Answers (2)

ilan berci
ilan berci

Reputation: 3881

Using STI doesn't open you up to any new security issues as they are orthogonal..

However, STI may upset your DBAs as you will have null fields within that table. (attributes that are present in one sub classed model and not the other)

As from the design stand point, what are you achieving by having such a model relationship. If the only distinction between a User and a Contact is that a User can log in and can have numerous contacts then you can simply have an individual that can have many contacts (which map to Individuals) AND can possibly have login credentials

Remember that a contact may be shared by numerous individuals which stipulates either a has_and_belongs_to_many or has_many :through

hth

Upvotes: 1

adamaig
adamaig

Reputation: 262

Conceptually I wouldn't mix them. The underlying intent/function of each model is substantially different, so the fact that they look similar in shape is a red-herring.

Potentially you'd run into a problem where someone could figure out a way to authenticate with a Contact, although it doesn't seem very likely, given its unlikely that you assign a username to a contact, or the secret hash stuff. But it would be possible if there is a bug in AuthLogic, or if someone tried hard enough to hack your setup and you weren't anal about protecting against injection attacks.

Also, there are performance reasons to not do this if your app grows a lot. Basically, I think its a bad design to have these two models rely on the same table for fairly superficial reasons.

Upvotes: 1

Related Questions