Страницы

Поиск по вопросам

среда, 22 января 2020 г.

CanCan: как ограничить доступ к экшену?

#ruby #ruby_on_rails


В Ability.rb ограничение накладывается над действиями в модели. А как ограничить
доступ к экшенам контроллера?    


Ответы

Ответ 1



CanCan ограничивает доступ именно к action'ам контроллеров. Есть другой проект, heimdallr, который ограничивает доступ именно при доступе к модели. Пример для CanCan ability.rb: class Ability include CanCan::Ability def initialize(user) return if user.nil? if user.role? :admin can :manage, :all # ... end if user.role? :moderator can :manage, Post can :index, User # ... end # user can :create, Post # ... end контроллер: class PostsController < ApplicationController before_filter :authenticate_user! def index authorize! :index, Post # ... end end и, RTFM

Ответ 2



before_filter? Вот здесь есть что то похожее, оно?: #models.ability.rb def initialize(user) #код if user.role?(:user) can :get_tags, Post #код end ... #config/routes.rb resources :posts do #.... post :get_tags, :on => :collection end Вы честно не пользовались поиском, или не можете понять что искать? Вот начал читать про канкан, всё намного интереснее. Похоже что в рамках идеологии канкана без костылей не получиться правильно ограничить доступ к акшену. Вам точно надо это делать через канкан? UPD Хотя это вроде то что надо, хотя не вижу тут принципиального отличия от before_filter

Ответ 3



В cancan по умолчанию накладывается ограничение на экшны контроллера, который завязан на модель (RESTful архитектура), поэтому класс, либо экземпляр класса используются для авторизации. Поскольку в рассматриваемом случае не используется RESTful парадигма, то надо объявить доступ в Ability и авторизовать его в контроллере: #ability.rb class Ability include CanCan::Ability def initialize(user) can :read, :home if user.has_role?(:home_reader) end end # home_controller.rb class HomeController < ApplicationController def index authorize! :read, :home end end

Комментариев нет:

Отправить комментарий