使用 CanCanCan gem 和 ActiveAdmin 创建授权
Create authorization using CanCanCan gem and ActiveAdmin
我创建了一些规则,其中之一如下:
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
.
来使用我的授权规则
我面临的一个问题是,每当我创建一个 "New Ticket" 时,我都会被拒绝访问。
我仔细检查了失败的条件,AA 似乎要求以下内容:
my_user.can? :create, Ticket.new # which returns false!
当我认为它应该要求以下内容时:
my_user.can? :create, Ticket # which returns true!
Ticket.new 将所有参数设置为零:
<Ticket author_id: nil, ..., created_at: nil, updated_at: nil>
这就是我的 CanCanCan 哈希条件失败的原因(author_id = nil 无效,应该是 user_id)。
是否有可能解决这个问题?也许我以错误的方式设置了 CanCanCan 规则?
ActiveAdmin 还提供开箱即用的 CanCanCan 适配器,所以我想知道他们怎么会忽略这一点。
基于对类似问题的回答:
ActiveAdmin.register Ticket do
before_build do |ticket|
ticket.author = current_user
end
end
这会在创建新对象时设置作者,使其符合 CanCanCan 能力中配置的可访问性。
@GoGoCarl 对上面的相关问题进行了评论,但我已经针对此处提出的问题进行了修改。原答案:
我创建了一些规则,其中之一如下:
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
.
我面临的一个问题是,每当我创建一个 "New Ticket" 时,我都会被拒绝访问。
我仔细检查了失败的条件,AA 似乎要求以下内容:
my_user.can? :create, Ticket.new # which returns false!
当我认为它应该要求以下内容时:
my_user.can? :create, Ticket # which returns true!
Ticket.new 将所有参数设置为零:
<Ticket author_id: nil, ..., created_at: nil, updated_at: nil>
这就是我的 CanCanCan 哈希条件失败的原因(author_id = nil 无效,应该是 user_id)。
是否有可能解决这个问题?也许我以错误的方式设置了 CanCanCan 规则?
ActiveAdmin 还提供开箱即用的 CanCanCan 适配器,所以我想知道他们怎么会忽略这一点。
基于对类似问题的回答:
ActiveAdmin.register Ticket do
before_build do |ticket|
ticket.author = current_user
end
end
这会在创建新对象时设置作者,使其符合 CanCanCan 能力中配置的可访问性。
@GoGoCarl 对上面的相关问题进行了评论,但我已经针对此处提出的问题进行了修改。原答案: