【问题标题】:Create authorization using CanCanCan gem and ActiveAdmin使用 CanCanCan gem 和 ActiveAdmin 创建授权
【发布时间】:2017-12-11 15:59:13
【问题描述】:

我创建了一些规​​则,其中之一如下:

can :create, Ticket, { author_id: user.id }

这应该允许当前经过身份验证的用户仅在 author_id 等于用户的 id 时创建票证。

从 rails 控制台我可以测试我的规则是否正常工作:

my_user.can? :create, Ticket.new(author: my_user)      # returns true
my_user.can? :create, Ticket.new(author: another_user) # returns false

考虑到我正在使用 ActiveAdmin,我现在需要通过使用它的ActiveAdmin::AuthorizationAdapter 来使用我的授权规则。

我面临的一个问题是,每当我创建“新票证”时,我都会被拒绝访问。

我仔细检查了失败的条件,似乎 AA 要求以下内容:

my_user.can? :create, Ticket.new # which returns false!

当我认为它应该要求以下内容时:

my_user.can? :create, Ticket # which returns true!

Ticket.new 将所有参数设置为 nil:

<Ticket author_id: nil, ..., created_at: nil, updated_at: nil>

这就是我的 CanCanCan 哈希条件失败的原因(author_id = nil 无效,它应该是 user_id)。

是否有可能解决此问题?也许我以错误的方式设置我的 CanCanCan 规则?

ActiveAdmin 还提供了一个开箱即用的 CanCanCan 适配器,所以我想知道他们怎么会忽略这一点。

【问题讨论】:

  • 正如您已经说过的,您需要在验证运行之前预设 Ticket.author 的值;否则,他们将失败。方法如下:stackoverflow.com/questions/7557914/…
  • 您有 AdminUser 模型,ActiveAdmin 尝试授权,但 AdminUser 与 Author 模型不同。

标签: ruby-on-rails activeadmin cancancan


【解决方案1】:

基于对类似问题的回答:

ActiveAdmin.register Ticket do
  before_build do |ticket|
    ticket.author = current_user
  end
end

这会在创建新对象时设置作者,从而使其能够按照 CanCanCan 功能中的配置进行访问。

@GoGoCarl 对上述相关问题发表了评论,但我已针对此处提出的问题进行了修改。原答案:

https://stackoverflow.com/a/28738827/3353794

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多