CanCan Gem - 如何让cancan拒绝访问丢失的资源?

时间:2011-11-03 07:11:48

标签: ruby-on-rails-3 cancan

我的Gemfile中有以下内容

gem 'cancan', '1.6.4'

我能够很好地使用cancan,除非在资源缺失的情况下。让我们说我是一个资源用户,访问受CanCan保护。

所以我的ability.rb文件有

can :manage, User, :user_id => @user.id

这很有用,因为用户只能操纵他们自己的个人资料 - 如果你试图管理别人的个人资料,cancan会抛出CanCan::AccessDenied

然而,如果某人正在捕获帐户并开始使用随机用户ID来访问用户信息,则尝试点击http://myserver.com/users/100并且如果id为100的用户不存在则会出现错误,因为cancan无法甚至可以找到id = 100的用户的记录。

这不是优雅的 - 我喜欢cancan仍然会抛出CanCan::AccessDenied异常以便

  1. 用户体验更好
  2. 当有人钓鱼时,我的exception_logger数据库并没有充满异常
  3. 我没有收到此通知
  4. 实际上我希望cancan能够拒绝访问缺少的资源

    非常感谢任何指针

1 个答案:

答案 0 :(得分:1)

我从来没有这样做,但我认为你可以放置一个处理ActiveRecord :: RecordNotFound的全局异常处理程序,并抛出所需的异常。

应用程序控制器中的类似内容可能有效:

class ApplicationController < ActionController::Base
  rescue_from(ActiveRecord::RecordNotFound) {
    raise(CanCan::AccessDenied, 'Invalid access request')
  }
end