After doing my own research, it looks like I can approach this two ways:

1. Episode 237, Railscasts, Dynamic att_accessible, overriding 
mass_assignment_authorizer
2. I can use attr_accessible role, as: :admin

I would appreciate it if anyone can elaborate on the merits of either 
approach.


On Sunday, April 29, 2012 4:48:12 PM UTC-4, Mohamad El-Husseini wrote:
>
> I have User, Account, and Role models. Role stores the relationship type 
> between Account and User.
>
> I know that *attr_accessible* should be blank in the Role model to 
> prevent attackers from changing either the role type (owner, 
> admin, moderator, subscriber), account, or user ids.
>
> But what if an admin wants to change a subscriber to a moderator? This 
> would raise a mass assignment security exception:
>
> user = User.find(params[:id])
> role = user.roles.find_by_account_id(params[:account_id])
> role.type = "admin"
>
> How do I solve this? One way is to create a separate model to represent 
> each role (owner, admin, moderator, subscriber) and use an STI type 
> pattern. This lets me do:
>
> user = User.find(params[:id])
> user.moderatorship.build(account_id: params([:account_id])
>
> Tedious! I would have to create Onwership, Moderatorship, Subscribership, 
> etc..., and have them inherit from Role. If I want to stick to a single 
> Role model, how can I modify a role type without a having a mass assignment 
> security flaw?
>
> Also, I would appreciate an answer to this: Should I use a User has_many 
> roles (user can have a single record for each role type) or has_one role 
> (user can only have one role record, which must be toggled if their role 
> changes) pattern?
>
> Models:
>
> class User < ActiveRecord::Base
>   attr_accessible :name, :email
>
>   has_many :accounts, through: roles
> end
>
> class Account < ActiveRecord::Base
>   attr_accessible :title
>
>   belongs_to :user
> end
>
> class Role < ActiveRecord::Base
>   attr_accessible
> end
>
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/rubyonrails-talk/-/lP97z64Gr8oJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to