Rails 3:CanCan卡在重定向循环上!

时间:2011-04-08 09:28:58

标签: ruby-on-rails ruby-on-rails-3 routes infinite-loop cancan

我正在将rails 2.3.8 app升级到Rails 3.

我正在使用cancan进行授权,这似乎对除了root之外的大部分操作起作用。

我设置cancan的方式是,当用户未被授权时,他被重定向到应用程序的根URL(并显示一条短消息)。

您无需登录即可查看root操作,但cancan可以继续尝试重定向到它 - 因此它会停留在重定向循环上。

这一切都在rails 2.3.8中工作,所以它让我怀疑以下两件事之一:

  1. 新版本的cancan工作方式不同
  2. 我在设置路线方面犯了错误
  3. 这是routes.rb中的根操作/控制器:

    root :to => 'tours#browse_tours'
    

    这就是我在cancan的ability.rb模型中指定的(对于未登录的用户):

    can :browse_tours, Tour
    

    有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我认为在早期版本的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

它确实没有意义。在ability.rb中,如果此人尚未登录,我们将创建一个User实例(没有任何角色)(就像在http://asciicasts.com/episodes/192-authorization-with-cancan中一样)。

E.G。

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

然后允许这个“无角色”用户做某些事情,但由于某种原因,这不会在新版本的CanCan中出现。

无论如何,希望这个解释可以帮助其他人。