Rails 3: CanCan застрял в петле перенаправления! - PullRequest
2 голосов
/ 08 апреля 2011

Я обновляю приложение rails 2.3.8 до Rails 3.

Я использую cancan для авторизации, которая, кажется, работает для большинства моих действий, кроме root.

У меня есть возможность настроить cancan, когда пользователь не авторизован, он перенаправляется на корневой URL-адрес приложения (и отображается короткое сообщение).

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

Это все работало в рельсах 2.3.8, поэтому я подозреваю одну из двух вещей:

  1. Новая версия cancan работает по-другому
  2. Я допустил ошибку при настройке маршрутов

Это корневой экшн / контроллер в router.rb:

root :to => 'tours#browse_tours'

И это то, что я указал в модели cancan's powers.rb (для не авторизованных пользователей):

can :browse_tours, Tour

Есть мысли?

1 Ответ

1 голос
/ 08 апреля 2011

Я думаю, что в обновлении с более ранней версии CanCan что-то изменилось.

Я обнаружил, что проблема на самом деле была в моем контроллере.В моем контроллере у меня было:

load_and_authorize_resource :user
load_and_authorize_resource :tour, :through => :user

Я мог использовать вышеупомянутое, и «browse_tours» все еще был доступен для гостевых пользователей.

Чтобы обойти это, я сказал cancan не беспокоиться о выполнении авторизации надействие:

load_and_authorize_resource :user
load_and_authorize_resource :tour, :through => :user, :except => :browse_tours

Это имеет и не имеет смысла.В powers.rb мы создаем экземпляр User (без каких-либо ролей), если человек не вошел в систему (как в http://asciicasts.com/episodes/192-authorization-with-cancan).

EG

user ||= User.new
if user.has_role? :admin
 #allow admin to do stuff
elsif user.has_role? :normal
 #allow signed in user to do stuff
else
 #guest user so allow to read
 can [:read, :browse_tours], Tour
end

This 'Пользователю без ролей было разрешено делать определенные вещи, но по какой-то причине это не срабатывает в новой версии CanCan.

В любом случае, надеюсь, это объяснение поможет кому-то другому.

...