Вложенные ресурсы Cancan, ограничивающие доступ к индексу

В настоящее время я использую cancan в своем веб-приложении, и до сих пор он отлично работает, но есть проблема, связанная с вложенными ресурсами в рельсах. При доступе к странице индексирования cancan не ограничивает пользователя видением того, что может видеть другой зарегистрированный пользователь. Он отлично работает на страницах показа, но при посещении индексной страницы он не работает.

routes.rb

resources :skater do
 resources :videos
end

ability.rb

can :manage, Video, :skater => { :user_id => user.id }

video_controller.rb

load_and_authorize_resource :skater
load_and_authorize_resource :video, :through => :current_user

Как я могу ограничить доступ к представлению индекса других пользователей, чтобы пользователь не мог просматривать видео пользователя B?

2 ответа

Попробуйте удалить :through => :current_user, чтобы узнать, исправлена ​​ли эта проблема. Посмотрите на второй пример кода в CanCan Wiki, чтобы увидеть, как предполагается использовать вложенные ресурсы.

CanCan будет захватывать текущего пользователя с помощью метода current_user в вашем приложении. Из-за этого вам не нужно определять его, когда вы разрешаете действия контроллера.

Обновление: Попробуйте использовать это в своем контроллере.

load_and_authorize_resource :skater
load_and_authorize_resource :video, :through => :skater

Обновление 2: Я не могу сказать, сбой CanCan из-за Приоритет способности или потому, что текущий пользователь просто несанкционирован.

Основываясь на том, что я видел до сих пор, так выглядит ваш файл ability.rb. Вторая строка перезапишет первую строку, что позволит вам ограничить количество просмотров и изменений. Я решил использовать :manage, потому что он "охватывает все базы", ​​включая все разрешения.

cannot :manage, Video # this will include :read, :show, :edit, :update, and :delete
can :manage, Video, :skater => { :user_id => user.id }

Меня беспокоит то, что вы не правильно фильтруете фигуриста. Если у вас возникнут проблемы, я бы попробовал это.

can :manage, Video, :user_id => user.id


Вы должны проверить этот вопрос, это та же проблема, что и вы.

Ограниченный доступ к файлам Cancan: index

licensed under cc by-sa 3.0 with attribution.