gpt4 book ai didi

ruby-on-rails - CanCan 和数据集

转载 作者:行者123 更新时间:2023-12-01 01:31:34 28 4
gpt4 key购买 nike

我已经为此苦苦挣扎了一段时间,终于到了 CanCan 似乎不允许您授权一组记录的地步。例如:

ads_controller.rb

def index
@ads = Ad.where("ads.published_at >= ?", 30.days.ago).order("ads.published_at DESC")
authorize! :read, @ads
end

能力.rb
def initialize(user)
user ||= User.new # Guest user

if user
if user.role? :admin # Logged in as admin
can :manage, :all
else # Logged in as general user
can :read, Ad
can :read_own, Ad, :user_id => user.id
can :create, Ad
end
else # Not logged in (Guest)
can :read, Ad
end
end

这会在尝试访问索引操作时产生未经授权的访问消息。
You are not authorized to access this page.

但是,如果您更改 index 操作中的授权调用以检查 Ad 类而不是像这样的集合
def index
@ads = Ad.where("ads.published_at >= ?", 30.days.ago)
authorize! :read, Ad
end

...它工作正常。

任何帮助解释这一点将不胜感激。

提前致谢。

附:在尝试解决此问题时,我最初是收到重定向循环。事实证明,有一个带有推荐的rescue_from 的gotchya,您将其放入应用程序 Controller 中,以便为您提供很好的错误消息。如果您的 root_path 设置为您授权的同一个地方! call 不正确(或失败),你会得到一个重定向循环。注释掉rescue_from 学到了一个艰难的方式。

最佳答案

CanCan 不是为了那样使用而设计的。您可以检查用户是否拥有模型类(例如 Ad )或单个实例(例如 @ad )的权限。

我建议你使用 accessible_by过滤您的收藏:

@ads = Ad.where("ads.published_at >= ?", 30.days.ago).accessible_by(current_ability) 
# @ads will be empty if none are accessible by current user

raise CanCan::AccessDenied if @ads.empty? # handle however you like

另一种方法是根据您用于检索集合的条件定义自定义权限:
# ability.rb
can :read_ads_from_past_month, Ad, ["ads.published_at >= ?", 30.days.ago]

# in your controller
def index
authorize! :read_ads_from_past_month, Ad
@ads = Ad.where("ads.published_at >= ?", 30.days.ago)
end

关于ruby-on-rails - CanCan 和数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4426418/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com