Я бы предпочел декларативное_авторизация , а не канкан, , если роли пользователя более сложные
https://github.com/stffn/declarative_authorization
http://railscasts.com/episodes/188-declarative-authorization
http://steffenbartsch.com/blog/2008/09/delclarative-authorization/
С помощью declarative_authorization
вы можете определить авторизацию ваших моделей и методов на основе ролей.
Вы можете определить разрешения для моделей и методов в модели. Вы можете дополнительно ограничить разрешения, если выполняются определенные условия, например, Вы можете указать, что определенные разрешения применяются только в том случае, если определенный атрибут объекта имеет определенное значение.
Вот пример, в котором указано, что обычный пользователь может только читать и изменять учетные записи компаний, в которых он / она работает. (При условии, что учетные записи расположены в древовидной форме, например, с жемчужиной "предков")
authorization do
role :user do
# ...
has_permission_on :accounts , :to => [:index, :show, :edit, :update] do
if_attribute :id => is_in { user.employed_at_account.subtree_ids }
end
# ...
end
role :admin do
# ...
has_permission_on :accounts , :to => [:create, :new, :index, :show , :edit, :update ]
# ...
end
end