我正在将rails 2.3.8 app升级到Rails 3.
我正在使用cancan进行授权,这似乎对除了root之外的大部分操作起作用。
我设置cancan的方式是,当用户未被授权时,他被重定向到应用程序的根URL(并显示一条短消息)。
您无需登录即可查看root操作,但cancan可以继续尝试重定向到它 - 因此它会停留在重定向循环上。
这一切都在rails 2.3.8中工作,所以它让我怀疑以下两件事之一:
这是routes.rb中的根操作/控制器:
root :to => 'tours#browse_tours'
这就是我在cancan的ability.rb模型中指定的(对于未登录的用户):
can :browse_tours, Tour
有什么想法吗?
答案 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中出现。
无论如何,希望这个解释可以帮助其他人。